<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>dev.101101101.ru</title><generator>teletype.in</generator><description><![CDATA[Техническое приложение к блогу 101101101.ru]]></description><image><url>https://img3.teletype.in/files/ee/49/ee494fbe-01f7-4f96-91c4-7adb51569f80.png</url><title>dev.101101101.ru</title><link>https://dev.101101101.ru/</link></image><link>https://dev.101101101.ru/?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/dev.101101101?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/dev.101101101?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 13 May 2026 10:47:10 GMT</pubDate><lastBuildDate>Wed, 13 May 2026 10:47:10 GMT</lastBuildDate><item><guid isPermaLink="true">https://dev.101101101.ru/funny</guid><link>https://dev.101101101.ru/funny?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/funny?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>Забавное</title><pubDate>Sat, 14 Mar 2026 11:52:51 GMT</pubDate><description><![CDATA[Позвонил аналитик-питонист...]]></description><content:encoded><![CDATA[
  <p id="sRiM">Позвонил аналитик-питонист...</p>
  <p id="pQ0z">- Как мне из 1С достать начисления и оплаты покупателей в разрезе договоров? - поинтересовался он.<br />- Оборотно-сальдовая ведомость по счету 62 - ответил я.</p>
  <p id="4quE">И тут же пришло понимание, что для него эта фраза прозвучала, как какое-то заклинание. Понятно, что человек, увлеченный прогрессивными технологиями, в этом не виноват. Появится больше времени - поделюсь, покажу, научу...</p>
  <p id="yXcP">Огорчает другое. Как далеки все эти надутые как пузырь современные парадигмы со всеми своими, по сути второстепенными, шашечками от реального мира. А в реальном мире технарям, и не только им, очень полезно разбираться в экономике и бухгалтерии...</p>
  <p id="Rm8w"></p>
  <p id="80eI"><a href="https://dev.101101101.ru/AutorecordingOfAccountingTransactions" target="_blank">←41</a> | заметка 42</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://dev.101101101.ru/AutorecordingOfAccountingTransactions</guid><link>https://dev.101101101.ru/AutorecordingOfAccountingTransactions?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/AutorecordingOfAccountingTransactions?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>Автоматическая запись бухгалтерских проводок</title><pubDate>Sun, 01 Mar 2026 15:39:06 GMT</pubDate><description><![CDATA[Примерно раз лет в 10 возникает эта простая задача. Помнить это естественно невозможно, поэтому решил записать (в том числе для себя), чтобы больше не разгребать странные советы из поисковиков...]]></description><content:encoded><![CDATA[
  <p id="KAaG">Примерно раз лет в 10 возникает эта простая задача. Помнить это естественно невозможно, поэтому решил записать (в том числе для себя), чтобы больше не разгребать странные советы из поисковиков...</p>
  <p id="gY9g">Итак, нужно у автоматически создаваемых документов подправить стандартные проводки и добавить еще несколько новых. Больше всего для решения подходит вполне себе типовой механизм ручной корректировки. Тут 1С-ники использовали неудачный термин. Вручную делать это вовсе необязательно...</p>
  <pre id="lpmG">//Сначала заполненный программно документ проводим как обычно,
//чтобы кроме проводок записались все необходимые регистры
НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение);

//Затем меняем реквизит ручной корректировки и записываем уже без проведения
НовыйДокумен.РучнаяКорректировка = Истина;
НовыйДокумен.Записать(РежимЗаписиДокумента.Запись);

//Перебираем существующие проводки, заменяем счет и субконто
Для Каждого Движение из НовыйДокумен.Движения.Хозрасчетный Цикл
	Если Движение.СчетКт = НеправильныйСчет Тогда
		Движение.СчетКт = ПравильныйСчет;
		
		//Перед установкой субконто обязательно очищаем имеющуюся коллекцию:
		//и виды, и значения
		Движение.СубконтоКт.Очистить();
		
		//Устанавливаем нужные субконто (допустим счет у нас взаиморасчетный)
		Движение.СубконтоКт.Контрагенты = НужныйКонтрагент;
		Движение.СубконтоКт.Договоры = НужныйДоговорКонтрагента;
		Движение.СубконтоКт.ДокументыРасчетовСКонтрагентами = НужныйДокумент;
	КонецЕсли;
КонецЦикла;

//Фрмируем новые проводки (например нужно частично сторнировать поступление)
Для Каждого СтрокаНачислений из МассивСтрокНачислений Цикл
	НовоеДвижение = НовыйДокумен.Движения.Хозрасчетный.Добавить();
	НовоеДвижение.Период = НовыйДокумен.Дата;
	НовоеДвижение.Регистратор = НовыйДокумен.Ссылка;
	НовоеДвижение.Активность = Истина;
	НовоеДвижение.СчетДт = Счет20_01;
	НовоеДвижение.ПодразделениеДт = НужноеПодразделениеЗатрат;
	НовоеДвижение.СубконтоДт.НоменклатурныеГруппы = СтрокаНачислений.НоменклатурнаяГруппа;
	НовоеДвижение.СубконтоДт.СтатьиЗатрат = СтрокаНачислений.СтатьяЗатрат;
	НовоеДвижение.СчетКт = Счет60_01;
	НовоеДвижение.СубконтоКт.Контрагенты = НужныйКонтрагент;
	НовоеДвижение.СубконтоКт.Договоры = НужныйДоговорКонтрагента;
	НовоеДвижение.СубконтоКт.ДокументыРасчетовСКонтрагентами = НужныйДокумент;
	НовоеДвижение.Организация = НужнаяОрганизация;
	СуммаБезНДС = СтрокаНачислений.СуммаБезНДС;
	НовоеДвижение.Сумма = -СуммаБезНДС;
	НовоеДвижение.СуммаНУДт = -СуммаБезНДС;
	НовоеДвижение.СуммаНУКт = -СуммаБезНДС;
	НовоеДвижение.Содержание = &quot;Реализация услуг&quot;;
КонецЦикла;

//Записываем проводки
НовыйДокумен.Движения.Хозрасчетный.Записать();</pre>
  <p id="Y3FM"></p>
  <p id="oug8">Вот и все. В результате получается проведенный документ с нужными нетиповыми проводками. Иногда, сейчас уже очень редко, это нужно. А ломать стандартный механизм проведения или создавать новый вид документов не пришлось.</p>
  <p id="SchV">P.S. Только важно помнить, что у помеченных на удаление документов с ручной корректировкой проводки остаются. У них просто переключается свойство Активность в положение Ложь. И понятно для чего так сделано. Чтобы при снятии пометки удаления все восстановилось как было. Поэтому в запросах не к виртуальным таблицам, а напрямую к записям регистра бухгалтерии (и других регистров) надо не забывать это учитывать (обязательно добавлять условие &quot;Активность = Истина&quot;). В примере ниже данные не выведутся:</p>
  <pre id="uGNd">Выбрать * Из РегистрБухгалтерии.Хозрасчетный
Где Регистратор Ссылка Документ.РеализацияТоваровУслуг
и Регистратор.ПометкаУдаления = Истина и Активность = Истина</pre>
  <p id="llGT"></p>
  <p id="ezmj"><a href="https://dev.101101101.ru/DeletingRows" target="_blank">←40</a> | заметка 41 | <a href="https://dev.101101101.ru/funny" target="_blank">42→</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://dev.101101101.ru/DeletingRows</guid><link>https://dev.101101101.ru/DeletingRows?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/DeletingRows?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>Правильное удаление строк</title><pubDate>Sat, 10 Jan 2026 12:20:13 GMT</pubDate><description><![CDATA[Как обычно очень простая задача. Зачем такое вообще пишу, ведь легко и быстро гуглится, да и языковые модели все это знают и умеют. Но ключевое слово здесь &quot;Правильное&quot;...]]></description><content:encoded><![CDATA[
  <p id="je2y">Как обычно очень простая задача. Зачем такое вообще пишу, ведь легко и быстро гуглится, да и языковые модели все это знают и умеют. Но ключевое слово здесь &quot;Правильное&quot;...</p>
  <p id="YipF">Итак имеем таблицу, например табличную часть документа, где главная колонка - номенклатура. Например:</p>
  <pre id="tKYE">1. Помидор
2. Огурец
3. Редиска
4. Лук
5. Укроп</pre>
  <p id="kDRV">Допустим хотим удалить Помидор и Редиску. И для этого у нас заполнился МассивИндексовДляУдаления с соответствующими индексами 0 и 2...</p>
  <p id="eBLj">Возьмем цикл с прямым обходом:</p>
  <pre id="fGUu">Для Каждого Индекс из МассивИндексовДляУдаления Цикл
	Таблица.Удалить(Индекс);
КонецЦикла;</pre>
  <p id="rjcx">При этом удалятся Помидор и Лук. Потому что после удаления строки помидора, строка лука станет третьей (с индексом 2). Эта ошибка известна всем.</p>
  <p id="vZN0">Хорошо, тогда давайте сделаем цикл с обратным обходом, ну или проще, отсортируем наш массив индексов по убыванию:</p>
  <pre id="4Wxi">Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(МассивИндексовДляУдаления);
Список.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
МассивИндексовДляУдаления = Список.ВыгрузитьЗначения();
Для Каждого Индекс из МассивИндексовДляУдаления Цикл
	Таблица.Удалить(Индекс);
КонецЦикла;</pre>
  <p id="fDw4">Удалились Помидор и Редиска. Все работает, все отлично. Но давайте порассуждаем дальше. Зачем нам удалять строки? Вероятно срабатывает какая-то проверка, которая по какому-то условию находит лишнее и заполняет массив для удаления. А если мы потом добавили еще одну проверку. И какая-то строка была настолько отвратительной, что не прошла обе проверки и в итоге в массив для удаления ее индекс добавится дважды. Ведь мы же обязательно забудем проконтролировать дубли :-) Как сработает наш код, если попробовать дважды удалить Редиску? А удалятся Редиска и Лук. Без какой-либо сигнализации об ошибке. И всплывет это счастье вовсе не на тестах, а уже в эксплуатации когда успеет много чего испортить.</p>
  <p id="KQy5">Поэтому всегда следует удалять строки не по индексу, а по значению. То есть в массив для удаления нужно добавлять сами строки таблицы:</p>
  <pre id="ebdl">Для Каждого СтрокаТаблицы из МассивСтрокДляУдаления Цикл
	Таблица.Удалить(СтрокаТаблицы);
КонецЦикла;</pre>
  <p id="uhSr">Это же даже проще. Синтаксис такой-же, а направление обхода теперь не важно. Ну а если в массиве появится задвоение, удалить уже удаленную строку не удастся, поэтому будет вызвано исключение, пользователю выведется информация об ошибке, при этом ничего не испортится. Программист добавит проверку массива на дубли и все будет хорошо.</p>
  <p id="N7fT">Ну то есть, этот конкретный пример подталкивает нас к использованию двух фундаментальных принципов:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="JH9L">Не нужно делать сложно, если можно сделать просто</p>
    <p id="Nugq">Не нужно использовать потенциально опасные приемы, даже если это разрешено</p>
  </section>
  <p id="0pY4"></p>
  <p id="JYWI"><a href="https://dev.101101101.ru/stoppers" target="_blank">←39</a> | заметка 40 | <a href="https://dev.101101101.ru/AutorecordingOfAccountingTransactions" target="_blank">41→</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://dev.101101101.ru/stoppers</guid><link>https://dev.101101101.ru/stoppers?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/stoppers?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>Заглушки в отдельном расширении</title><pubDate>Fri, 07 Nov 2025 16:19:03 GMT</pubDate><description><![CDATA[Предположим прямо в конфигурации 1С есть старые самописные бредовые обработки и вместо них в расширении с интенсивным развитием уже созданы и используются аналогичные нормальные. Удалить физически маразм пока нельзя, чтобы сохранить историю (было - стало). Небольшой простой совет, как с этим жить поаккуратнее...]]></description><content:encoded><![CDATA[
  <p id="g3b5">Предположим прямо в конфигурации 1С есть старые самописные бредовые обработки и вместо них в расширении с интенсивным развитием уже созданы и используются аналогичные нормальные. Удалить физически маразм пока нельзя, чтобы сохранить историю (было - стало). Небольшой простой совет, как с этим жить поаккуратнее...</p>
  <p id="RlBx">К сожалению в расширении нельзя убрать объекты из интерфейса. Но можно и, на первое время, нужно поставить &quot;заглушки&quot;. Заимствовать в расширение форму, а в модуле написать:</p>
  <pre id="R7G0">&amp;НаСервере
Процедура ПрефиксИмен_ПриСозданииНаСервереВместо(Отказ, СтандартнаяОбработка)
	Сообщить(&quot;Этот бред устарел и отключен! Вместо него используйте другой...&quot;);
КонецПроцедуры

&amp;НаКлиенте
Процедура ПрефиксИмен_ПриОткрытииВместо(Отказ)
	ЭтаФорма.Закрыть();
КонецПроцедуры</pre>
  <p id="dIpH"></p>
  <p id="Uo4u">Все отлично и наглядно, но ведь обязательно придет время физического удаления ненужных обработок. И тогда важно не забыть удалить заглушки из расширения, а то оно не применится. А если оно большое и в нем все активно используется, если кучу пропавших механизмов и элементов интерфейса заметят пользователи, а что будет если наоборот не обратят внимания и получат кривые записи в базе данных...</p>
  <p id="SNJh">Ну и тут на ум приходит простое очевидное правило из заголовка статьи. Заглушки и любые другие изменения в объектах, которые скоро или когда-нибудь потом будут удалены, нужно делать в отдельном специальном расширении. Не применится, ну и ладно. Во всяком случае ничего сильно страшного не произойдет. Конечно лучше вообще таких ситуаций не допускать, например с помощью чек-листа с проверками. Но в реальной жизни возможны любые накладки. И если сбой потенциально возможен, пусть он будет безобидным.</p>
  <p id="qDqL"></p>
  <p id="FHGN"><a href="https://dev.101101101.ru/UglyButWorkingSolution" target="_blank">←38</a> | заметка 39 | <a href="https://dev.101101101.ru/DeletingRows" target="_blank">40→</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://dev.101101101.ru/UglyButWorkingSolution</guid><link>https://dev.101101101.ru/UglyButWorkingSolution?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/UglyButWorkingSolution?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>Отвратительное, но рабочее решение</title><pubDate>Tue, 29 Apr 2025 15:30:06 GMT</pubDate><description><![CDATA[В отчете необходимо было добавить колонку с информацией, имеются ли настройки в табличной части основания регистратора некоего регистра или нет...]]></description><content:encoded><![CDATA[
  <p id="EpSb">В отчете необходимо было добавить колонку с информацией, имеются ли настройки в табличной части основания регистратора некоего регистра или нет...</p>
  <p id="50lz">База данных маленькая, служебная. Вид деятельности (сдача в аренду нежилых помещений) ну никак не предполагает стремительного роста объема данных. В итоге позволил себе написать в запросе такой кусок:</p>
  <pre id="zftq">Где Регистратор.Основание.ПоказателиОборота.НомерСтроки в (1)</pre>
  <p id="BEHq">Несколько разыменований, лайфках определения пуста ли таблица с помощью проверки есть ли в ней строка с номером один. В общем выглядит это ужасно. Но оно работает и обратите внимание, синтаксис почти повторяет текст задания. Да и писать это - несколько секунд. Лучше потратить время на получение основных данных, а не этого вспомогательного поля.</p>
  <p id="rahx">Через какое-то время оно к сожалению упало, когда у основания одного из регистраторов тип стал составным. Наругалось так:</p>
  <pre id="IoyI">Нельзя обращаться к вложенной таблице через поле составного типа</pre>
  <p id="VujB">Но эта ошибка (в простом и понятном коде) очень легко обнаружилась и исправилась. Буквально за пару минут. Надо было просто привести составной тип к нужному:</p>
  <pre id="lXTg">Где Выразить(Регистратор.Основание Как Документ.РегистрацияДоговоровАренды).ПоказателиОборота.НомерСтроки в (1)</pre>
  <p id="cHAY">Теперь не сломается никогда.</p>
  <p id="trzj">Даже не знаю, зачем это пишу, что и кому хочу доказать. Понятно, что надо учитывать масштабирование, рост объема данных и возможные будущие тормоза. Но на практике на нагруженных системах чаще встречаются инциденты из-за неправильной архитектуры и применения медленных алгоритмов. И это бывает у тех же авторов, которые идеально и многоэтажно (без разыменований, с кучей явных соединений) пишут запросы. Примеры:</p>
  <ul id="KaC7">
    <li id="d02a">Дополнительный интеграционный код, хранящийся в дополнительных реквизитах (в другой таблице без индекса).</li>
    <li id="COHg">Сервис часто отдающий объемные одинаковые данные (изменение номенклатуры и цен) сотням клиентов, вместо горизонтального масштабирования и кеширования в виде публикации готового файла.</li>
    <li id="SCoQ">Падение файловых магазинных розничных баз из-за блокировок типовых планов обмена.</li>
    <li id="gbeH">Программный перебор ячеек экселевской таблицы, вместо загрузки целой области или вообще работы с CSV.</li>
    <li id="7eZN">Массовая запись в регистр сведений (сегменты номенклатуры) без использования транзакций.</li>
  </ul>
  <p id="JhJy">Понимаете, пройдет время, выйдут новые версии 1С и СУБД, выполнение запросов с разыменованиями будет оптимизировано и ускорено, а архитектурные просчеты и медленные циклические операции так и будут приводить к деградации производительности учетных систем. Как-то так...</p>
  <p id="Rrn7"></p>
  <p id="Hp8d"><a href="https://dev.101101101.ru/NegativeStep" target="_blank">←37</a> | заметка 38 | <a href="https://dev.101101101.ru/stoppers" target="_blank">39→</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://dev.101101101.ru/NegativeStep</guid><link>https://dev.101101101.ru/NegativeStep?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/NegativeStep?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>Отрицательный шаг цикла</title><pubDate>Mon, 14 Apr 2025 20:47:23 GMT</pubDate><description><![CDATA[Если вы программируете на чем-нибудь высокодуховном, то вероятно будете смеяться. Ведь нам в 1С до сих под этого не подвезли...]]></description><content:encoded><![CDATA[
  <p id="xXq3">Если вы программируете на чем-нибудь высокодуховном, то вероятно будете смеяться. Ведь нам в 1С до сих под этого не подвезли...</p>
  <p id="ESHt">Как же обойти значения от большего к меньшему? Раньше применял что-то подобное:</p>
  <pre id="qPqI">Для СчетчикЦикла = 1 По Всего Цикл
	НужноеЗначение = Всего - СчетчикЦикла + 1;
	...
КонецЦикла; </pre>
  <p id="PYTb">Особенно бесила эта дурацкая плюс единица, из-за которой надо было внимательно проверять как оно будет работать, особенно если речь идет о коллекции с индексами.</p>
  <p id="Jg04">А тут внезапно, в поисковике проскочила оригинальная идея:</p>
  <pre id="BTmb">Для СчетчикЦикла = -Всего По -1 Цикл
	НужноеЗначение = -СчетчикЦикла;
	...
КонецЦикла;</pre>
  <p id="FGUB">Ну согласитесь, что это красота! И главное, в таком подходе невозможно ошибиться.</p>
  <p id="01FF"></p>
  <p id="ZGLS"><a href="https://dev.101101101.ru/CorrectStringSearch" target="_blank">←36</a> | заметка 37 | <a href="https://dev.101101101.ru/UglyButWorkingSolution" target="_blank">38→</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://dev.101101101.ru/CorrectStringSearch</guid><link>https://dev.101101101.ru/CorrectStringSearch?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/CorrectStringSearch?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>Правильный поиск в строке с разделителями</title><pubDate>Sat, 23 Nov 2024 07:45:14 GMT</pubDate><description><![CDATA[Чтобы понять проблему, как всегда рассмотрим несколько утрированный пример...]]></description><content:encoded><![CDATA[
  <p id="j5QA">Чтобы понять проблему, как всегда рассмотрим несколько утрированный пример...</p>
  <p id="5lfV">При интеграции из другой системы прилетает массив расчетных показателей. Их много. Записывать их отдельно в какой-нибудь таблице в своей базе данных необязательно. Для работы нужны 2-3 из 100, не более. Поэтому такой массив временно хранится в строке с разделителями, примерно так:</p>
  <pre id="eafm">СуммаОборота; СуммаОборотаСНДС; ээНачальныеПоказания; ээКонечныеПоказания</pre>
  <p id="FaBm">Так вот, на каком-то этапе некий парсинг ищет в этой строке. Как искать правильно? Допустим простое решение в лоб:</p>
  <pre id="J5Oc">Если Найти(СтрокаПоказателей, СтрокаПоиска) Тогда</pre>
  <p id="Wklk">Но ведь косяк же. Видите его? Честно признаюсь, я несколько раз больно натыкался. Например:</p>
  <pre id="YBkh">Если Найти(СтрокаПоказателей, &quot;СуммаОборота&quot;) Тогда</pre>
  <p id="pSCn">Поиск будет неожиданно успешным если суммы оборота в показателях нет, зато есть сумма оборота с НДС. Обидно. Что делать в таких случаях?</p>
  <p id="NMbH">Понятно, что если перед поиском строку переделать в массив и искать в нем, все будет в порядке. Но тратить на это время, особенно если таких строк много и наш парсинг работает в цикле, такое себе решение.</p>
  <p id="P9DF">Добавить в строку поиска разделитель? Но у последнего элемента разделителя же нет. Ну так в чем проблема, давайте его добавим и в строку показателей (один раз прямо перед поиском):</p>
  <pre id="ecsP">СтрокаПоказателей = ХранящаясяСтрокаПоказателей + &quot;;&quot;;

Если Найти(СтрокаПоказателей, СтрокаПоиска + &quot;;&quot;) Тогда</pre>
  <p id="5gQA">Вот теперь все хорошо.</p>
  <p id="jkk5">Еще один важный момент. Понятно, что к поиску надо всегда относится аккуратно. Ну а наименование любых сущностей надо продумывать с удвоенной внимательностью. Что такое эта наша СуммаОборота? Какая она, с НДС или без НДС, ведь это же неочевидно, это почему-то надо помнить, и программистам, и пользователям. А вот если бы было явно: СуммаОборотаБезНДС, СуммаОборотаСНДС, то ошибки поиска бы не возникло. В итоге вырисовывается полезное правило:</p>
  <section style="background-color:hsl(hsl(24,  24%, var(--autocolor-background-lightness, 95%)), 85%, 85%);">
    <p id="LV3N">Если в наименование какой-либо сущности добавляется уточнение, то тогда не должно быть случаев без этого уточнения.</p>
  </section>
  <p id="NVFS"></p>
  <p id="Zu4r"><a href="https://dev.101101101.ru/DidNotWork" target="_blank">←35</a> | заметка 36 | <a href="https://dev.101101101.ru/NegativeStep" target="_blank">37→</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://dev.101101101.ru/DidNotWork</guid><link>https://dev.101101101.ru/DidNotWork?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/DidNotWork?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>Не сложилось</title><pubDate>Sun, 17 Nov 2024 07:58:29 GMT</pubDate><description><![CDATA[Функциональная парадигма. Полностью функциональные языки программирования, круто, таинственно, доступно только для избранных...]]></description><content:encoded><![CDATA[
  <p id="7cbs">Функциональная парадигма. Полностью функциональные языки программирования, круто, таинственно, доступно только для избранных...</p>
  <p id="qIWB">Смотрю подкаст со счастливым адептом, умиляюсь, завидую. А ведущий возьми, да и поинтересуйся: &quot;Вот у вас нет переменных, в смысле переменные не могут менять значения. Как же так. К примеру, как вы в таком случае реализуете алгоритм сортировки?&quot;. А гуру и говорит: &quot;Так это же в готовой библиотеке сделано, естественно нормально. Там переменные значения меняют&quot;. О как! Получается, стандартные вещи у них решены удобно, а для собственных разработок зачем-то нужно мучиться.</p>
  <p id="nrVk">Да ну его, подумал я, взял, да и выключил этот бред. В общем не сложилось у меня с функциональщиной.</p>
  <p id="aNfn"></p>
  <p id="vlAc"><a href="https://dev.101101101.ru/ForAallTheGoodAgainstAllTheBad" target="_blank">←34</a> | заметка 35 | <a href="https://dev.101101101.ru/CorrectStringSearch" target="_blank">36→</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://dev.101101101.ru/ForAallTheGoodAgainstAllTheBad</guid><link>https://dev.101101101.ru/ForAallTheGoodAgainstAllTheBad?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/ForAallTheGoodAgainstAllTheBad?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>За все хорошее против всего плохого, хотя так не бывает</title><pubDate>Sat, 16 Nov 2024 01:32:41 GMT</pubDate><description><![CDATA[Полистал старую книгу по программированию. Когда-то именно в ней нашел размышления про эффект первого разбитого окна, про необходимость немедленного ремонта (исправления ошибки) для предотвращения дальнейшего разрушения (потери контроля над проектом). После такого откровения и остальным тезисам автора веришь. Но сейчас, при повторном прочтении, обнаружилось странное...]]></description><content:encoded><![CDATA[
  <p id="7U8V">Полистал старую книгу по программированию. Когда-то именно в ней нашел размышления про эффект первого разбитого окна, про необходимость немедленного ремонта (исправления ошибки) для предотвращения дальнейшего разрушения (потери контроля над проектом). После такого откровения и остальным тезисам автора веришь. Но сейчас, при повторном прочтении, обнаружилось странное...</p>
  <p id="lCLi">Причем это очень популярное заблуждение теоретиков от программирования. Почему-то считается, что надо одновременно бороться с дублирующим и зависимым (связанным) кодом. Типа с помощью декомпозиции (повторного использования кода путем вынесения его в отдельную процедуру или функцию) можно добиться изоляции (когда доработки ничего не ломают). Но как же так. Ведь даже в обычной жизни очевидно, что нельзя быть за все хорошее против всего плохого. Нельзя выступать за низкие налоги и одновременно за высокие социальные льготы, потому что такое просто невозможно.</p>
  <p id="dOTF">В проекте с идеальной декомпозицией без дублей кода, с огромным количеством маленьких процедур, функций, методов, которые стремительно вызывают друг друга, изоляция невозможна, потому что все зависит от всего. Одно небольшое исправление может как эффект бабочки привести к самым неожиданным последствиям. А уж зависимость от сторонних разработок (библиотек) у большинства из нас вызывает яркие воспоминания об отказах после обновлений, описать которые можно только на эмоциональном русском языке. Наоборот, изолированный (несвязанный) код процедуры, функции, метода должен содержать в себе важные фрагменты, которые могут встретиться где-нибудь еще. Лишь бы изменение, добавление, обновление в одном месте системы не повлияло на другие отлаженные механизмы. Изоляция также может быть на уровне модулей с заимствованием (дублированием) служебных процедур и функций из других модулей и стандартных (сторонних) библиотек. Например, чтобы легко перенести модуль в другой (новый или наоборот устаревший) проект.</p>
  <p id="W4mW">То есть, получается, что декомпозиция и изоляция - антагонисты и взаимодействие между ними - это шкала:</p>
  <pre id="fCSq">Декомпозиция &lt;-------------------------&gt; Изоляция</pre>
  <p id="mQIc">Ну или если вам не нравится такое представление, можно наоборот:</p>
  <pre id="xYDb">Изоляция &lt;-------------------------&gt; Декомпозиция</pre>
  <p id="wcSp">Важно, что направления противоположны и в крайних положениях код получается отвратительным. То есть абсолютная декомпозиция также вредна, как и абсолютная изоляция.</p>
  <p id="uva1">Так что же делать, где на рассматриваемой шкале поставить свою точку? Тут-то и сказывается опыт разработчика, который примет приемлемое решение исходя из задачи. Если нужно написать какую-нибудь утилиту для чего-нибудь очень специфического, в качестве Open Source или может речь идет о внутренней офисной системе с большими технологическими окнами (нерабочее время и целые выходные), то здесь вполне можно блеснуть передовыми технологиями и декомпозицией. А если у вас интеграция розничных продаж с банками, где возможны прямые финансовые потери вкупе с трудоемким неочевидным интеграционным тестированием и неотзывчивой техподдержкой, то ну его на фиг, пусть все методы будут максимально изолированными даже с дублирующим кодом. Чтобы при добавлении нового, не упало то что работало.</p>
  <p id="u02P">Можно конечно пообещать себе и вселенной, что любой рефакторинг для улучшения декомпозиции обязательно пройдет процесс полного подробного тестирования. Но мы же взрослые люди, прекрасно понимаем, что это вранье.</p>
  <p id="onX7">Вы все еще не согласны со мной? А если скажу, что ставшая популярной микросервисная архитектура (в противовес монолиту) - это отчаянная попытка добиться изоляции, с пониманием, что раз сервисы разные, значит и одинаковый код, просочившийся в каждый из них, больше не под запретом! Ну разве это не забавно...</p>
  <p id="ujiO">Может показаться, что не стоит читать книги с сомнительными советами или крайне осторожно выбирать техническую литературу. Это не так. Просто не надо относится к писателям, как небожителям. Они обычные люди, такие же как мы. Они делятся своими знаниями и естественно могут заблуждаться. Просто не надо слепо верить написанному. Читайте, пробуйте, делайте собственные выводы. Придет время и может оказаться, что вы разобрались в теме лучше, чем написано в книге.</p>
  <p id="h4DQ"></p>
  <p id="mcpG"><a href="https://dev.101101101.ru/UnexpectedReturn" target="_blank">←33</a> | заметка 34 | <a href="https://dev.101101101.ru/DidNotWork" target="_blank">35→</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://dev.101101101.ru/UnexpectedReturn</guid><link>https://dev.101101101.ru/UnexpectedReturn?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101</link><comments>https://dev.101101101.ru/UnexpectedReturn?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dev.101101101#comments</comments><dc:creator>dev.101101101</dc:creator><title>Неожиданный возврат</title><pubDate>Wed, 06 Nov 2024 02:54:09 GMT</pubDate><description><![CDATA[Расширение конфигурации в хранилище. А там проверка, предотвращающая дубли записей некоего справочника. Но уже имеющийся дубль исправлять и склеивать не нужно для сохранения истории этой задвоенности. Хочется просто пометить на удаление, а это невозможно как раз из-за проверки. Как исправить быстро без танцев с хранилищем...]]></description><content:encoded><![CDATA[
  <p id="7KtE">Расширение конфигурации в хранилище. А там проверка, предотвращающая дубли записей некоего справочника. Но уже имеющийся дубль исправлять и склеивать не нужно для сохранения истории этой задвоенности. Хочется просто пометить на удаление, а это невозможно как раз из-за проверки. Как исправить быстро без танцев с хранилищем...</p>
  <p id="z0KO">Все просто. Создаем еще одно временное расширение, в него заимствуем ту же процедуру ПередЗаписью() и собственно разрешаем писать. Казалось бы, чего тут извергать из себя буквы. Но обратите внимание как неожиданно работает возврат. Вот простой пример...</p>
  <p id="eXEm">В конфигурации:</p>
  <pre id="OymU">Процедура ПередЗаписью(Отказ)
	Сумма = 1000; //любой код
КонецПроцедуры</pre>
  <p id="Vnc1">В первом расширении:</p>
  <pre id="taED">&amp;После(&quot;ПередЗаписью&quot;)
Процедура Расш1_ПередЗаписью(Отказ)
	Если Истина Тогда //какое-нибудь условие
		Отказ = Истина;
		Возврат;
	КонецЕсли;
	
	Сумма = 2000; //этот код не выполняется
КонецПроцедуры</pre>
  <p id="MQZV">Во втором расширении:</p>
  <pre id="0kMR">&amp;После(&quot;ПередЗаписью&quot;)
Процедура Расш2_ПередЗаписью(Отказ)
	Отказ = Ложь; //этот код
	Сумма = 3000; //выполняется	
КонецПроцедуры</pre>
  <p id="M7h2">То есть, возврат производится только из процедуры в конкретном расширении, но не из процедуры вообще. И это не баг, а фича, нужная как раз для подобных задач. Иногда такое поведение огорчает. Например, если охота не после, а перед стандартной процедурой проверить условие и вообще ее не выполнять:</p>
  <pre id="4Xdr">&amp;Перед(&quot;ПередЗаписью&quot;)
Процедура Расш1_ПередЗаписью(Отказ)
	Если КакоеНибудьУсловие Тогда
		Возврат;
	КонецЕсли;
КонецПроцедуры</pre>
  <p id="o7VN">Но нет, такой возврат вовсе не предотвращает исполнение стандартного кода, хотя казалось бы. В этом случае необходимо использовать &amp;Вместо:</p>
  <pre id="mSNQ">&amp;Вместо(&quot;ПередЗаписью&quot;)
Процедура Расш1_ПередЗаписью(Отказ)
	Если КакоеНибудьУсловие Тогда
		Возврат;
	Иначе
		ПродолжитьВызов(Отказ);
	КонецЕсли;
КонецПроцедуры</pre>
  <p id="2edT"></p>
  <p id="GJQS">Механизм расширения конфигураций очень удобен, нужно только понимать некоторые тонкости...</p>
  <p id="9bno"></p>
  <p id="Lo0e"><a href="https://dev.101101101.ru/UglyCode" target="_blank">←32</a> | заметка 33 | <a href="https://dev.101101101.ru/ForAallTheGoodAgainstAllTheBad" target="_blank">34→</a></p>

]]></content:encoded></item></channel></rss>