<?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>@dc-zp</title><generator>teletype.in</generator><description><![CDATA[@dc-zp]]></description><image><url>https://img4.teletype.in/files/77/f0/77f09760-53ba-4ba9-8eae-9ec508d38d0c.jpeg</url><title>@dc-zp</title><link>https://teletype.in/@dc-zp</link></image><link>https://teletype.in/@dc-zp?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/dc-zp?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/dc-zp?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Thu, 23 Apr 2026 00:12:37 GMT</pubDate><lastBuildDate>Thu, 23 Apr 2026 00:12:37 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@dc-zp/yszn6qtoVcR</guid><link>https://teletype.in/@dc-zp/yszn6qtoVcR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/yszn6qtoVcR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>Задача 5</title><pubDate>Fri, 30 Jan 2026 13:56:41 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/1b/d5/1bd55825-d9b5-48ce-9dcf-b29489e05648.png"></media:content><category>1C</category><description><![CDATA[<img src="https://img4.teletype.in/files/7a/bb/7abb8536-ad87-482a-9dc5-f3e4b9c3fa00.png"></img>Эта задача, как и предыдущие, во многом повторяет задачу 1, решение которой мы разбирали достаточно подробно. Поэтому сконцентрируем своё внимание на отличиях:]]></description><content:encoded><![CDATA[
  <p id="u7at">Эта задача, как и предыдущие, во многом повторяет задачу <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">1</a>, решение которой мы разбирали достаточно подробно. Поэтому сконцентрируем своё внимание на отличиях:</p>
  <ul id="z3pm">
    <li id="TUje">Учётная политика может меняться каждый день;</li>
    <li id="gosJ">Изменение Учётной политики фиксируется соответствующим документом;</li>
    <li id="Wdkr">&quot;Считается, что документы задним числом не вводятся, но старые документы могут проводиться неоперативно&quot;.</li>
    <li id="MqE6">Это единственная задача, в которой упоминается метод списания по средней;</li>
  </ul>
  <hr />
  <p id="DzdE">Пойдем от простого к сложному:</p>
  <ul id="Uael">
    <li id="Omee">Самый простой - первый пункт. Нужно просто установить периодичность регистра сведений содержащего хронологию изменений учётной политики в пределах дня и всё!</li>
    <li id="RZnM">С документом, фиксирующим её изменения вроде бы тоже всё просто. Нужно его создать, и назначить регистратором вышеупомянутого регистра, для чего сам регистр нужно будет сделать зависимым от регистратора. Но это кажущаяся простота, мы ещё вернёмся к этому пункту позже, когда станет понятен его истинный смысл.</li>
    <li id="F2Nb">Дальше нас ждёт весьма презабавная формулировочка: &quot;Считается...&quot;, - которая рождает вполне естественный вопрос: &quot;В каком смысле считается? В смысле того, что если кто-то введёт документ задним числом, для нас это станет полной неожиданностью?&quot;. И знаете, если бы это была реальная работа, я бы обязательно задал этот вопрос! Но мы на экзамене и вопросы задают нам, а мы отвечаем на свой страх и риск. Поэтому, коль скоро формулировка туманная, каждый сам для себя делает выбор:</li>
    <ul id="e5iO">
      <li id="hsQy">Не заморачиваться или</li>
      <li id="HLz0">Запретить!</li>
    </ul>
    <li id="9NmB">Как эффективно запретить ввод документов задним числом мы расскажем вам в задаче 6, поскольку там формулировка более конкретная: &quot;нельзя&quot;! А Вы между тем сможете определиться, какое решение больше импонирует Вам лично.</li>
    <li id="semi">И, наконец, последний пункт - списание по средней!</li>
  </ul>
  <p id="Likb">Вот он-то как раз особенный и, с аналитической точки зрения, самый сложный. Дело в том, что списание по средней, это уже не партионный учет!!! При списании по средней вы уже не можете указать с какой именно партии вы списываете товар. Поскольку цена во всех партиях потенциально разная, и может нигде не совпадать со средней ценой. Получается, что как только вы перейдёте на списание по средней, весь ваш партионный учет будет нарушен! И обратно восстановить его уже не удастся.</p>
  <p id="qVXB">Но не будем сокрушаться об этом - &quot;заказчик всегда прав&quot;. Наша задача собственно только в том и состоит, чтобы даже в таких условиях программа работала устойчиво, как ни в чём ни бывало, и не выдавала сообщений о системных ошибках. Ибо, когда программа тупо сбоит, программист в любом случае виноват. Даже если сбой вызван &quot;наведённой ошибкой&quot; [Заказчика при составлении ТЗ].</p>
  <p id="htoR">Главное, что мы для себя определили: переключение на списание по средней и обратно, это фактически отключение и включение партионного учета. И мы должны сделать это аккуратно без далеко идущих последствий.</p>
  <p id="Pkl3">Фактически, в момент перехода на списание по средней нам нужно избавиться от информации о партиях, так как в противном случае у нас:</p>
  <ul id="Nyrb">
    <li id="pQFk">либо будут зависать остатки по партиям, если мы просто не укажем партию в расходе;</li>
    <li id="tSO3">либо будет происходить рассогласование количества и стоимости, если мы будем списывать с конкретной партии, но по цене, отличающейся от цены прихода.</li>
  </ul>
  <p id="BofW">На экзамене за любую из этих ошибок мы можем потерять драгоценные 2 балла из 5.</p>
  <p id="40up">Вот тут-то и возникает необходимость в документе, упомянутом в третьем пункте, который оформляется как раз в момент перехода. Именно при проведении этого документа мы можем избавиться от партий, попросту свернув их. Нам нужно будет списать остатки по всем партиям в расход, и вновь поставить их на приход, но уже без указания партии.</p>
  <p id="REXH">И впредь, до перехода на списание по ЛИФО или ФИФО, больше не указывать их.</p>
  <p id="Sq9x">Из этого последнего замечания вытекает ещё одна особенность проведения документов, на этот раз, касающаяся приходной накладной. Прежде чем её провести, нам нужно знать, должна ли она указываться в качестве партии или нет. А для этого прежде нужно прочитать текущее значение учетной политики.</p>
  <p id="wf40">На экзамене за любую из этих ошибок мы можем потерять драгоценные 2 балла из 5.</p>
  <p id="4KIK">Вот тут-то и возникает необходимость в документе, упомянутом в третьем пункте, который оформляется как раз в момент перехода. Именно при проведении этого документа мы можем избавиться от партий, попросту свернув их. Нам нужно будет списать остатки по всем партиям в расход, и вновь поставить их на приход, но уже без указания партии.</p>
  <p id="hTLT">И впредь, до перехода на списание по ЛИФО или ФИФО, больше не указывать их.</p>
  <p id="MdPq">Из этого последнего замечания вытекает ещё одна особенность проведения документов, на этот раз, касающаяся приходной накладной. Прежде чем её провести, нам нужно знать, должна ли она указываться в качестве партии или нет. А для этого прежде нужно прочитать текущее значение учетной политики.</p>
  <p id="0Srk">Подведём итоги:</p>
  <ul id="0ttD">
    <li id="tQ79">Нам нужно создать документ, фиксирующий изменения учетной политики;</li>
    <li id="Udov">При переходе на списание по средней этот документ должен сворачивать партии;</li>
    <li id="VVDU">Поэтому он будет регистратором не только в регистре сведений об учетной политике, но и в регистре накопления остатков номенклатуры;</li>
    <li id="7A0U">Соответственно в регистре сведений об учетной политике должна быть указана зависимость от регистратора;</li>
    <li id="FG6i">Кроме того, в этом регистре должна быть установлена периодичность в пределах дня;</li>
    <li id="Q1UI">При списании по средней в движениях приходной накладной не следует указывать партию.</li>
  </ul>
  <p id="LHXr">Вот в принципе и всё. Алгоритм проведения расходной накладной, и даже запрос, который он делает, не меняется. А о том, как запретить ввод документов задним числом мы расскажем в задаче 6.</p>
  <hr />
  <p id="zdID">Создаем регистр сведений <strong>МетодыСписанияСебестоимости</strong>, устанавливаем его <strong>Периодичность В пределах дня</strong>, <strong>Режим записи Подчинение регистратору</strong>. Добавим регистр в подсистему <strong>ОперативныйУчет</strong>, а на закладке «Данные» создадим ресурс <strong>Метод </strong>типа <strong>ПеречислениеСсылка.УчетнаяПолитика</strong>.</p>
  <figure id="qdCA" class="m_column">
    <img src="https://img4.teletype.in/files/7a/bb/7abb8536-ad87-482a-9dc5-f3e4b9c3fa00.png" width="492" />
  </figure>
  <figure id="Pr7T" class="m_original">
    <img src="https://img2.teletype.in/files/91/fb/91fb43bc-0065-42e5-b233-28f2ecf3d9ff.png" width="490" />
  </figure>
  <figure id="WXVZ" class="m_custom">
    <img src="https://img1.teletype.in/files/49/03/490354e6-24a6-4435-ab7a-f6f7a6d35285.png" width="545" />
  </figure>
  <p id="HelX">В этом преречислении уже имеются значения <strong>ЛИФО </strong>и <strong>ФИФО</strong>, нужно добавить ещё одно значение: <strong>ПоСредней</strong>.</p>
  <figure id="QgHP" class="m_original">
    <img src="https://img2.teletype.in/files/9d/2e/9d2e23f2-fce5-45e5-b241-1478ad4efb95.png" width="490" />
  </figure>
  <p id="FbQO">Создаем документ <strong>ПриказОбУчетнойПолитике</strong>, добавляем его в подсистему <strong>ОперативныйУчет/Документы</strong>, на закладке «Данные» создаём реквизит <strong>МетодСписанияСебестоимости </strong>типа <strong>ПеречислениеСсылка.УчетнаяПолитика</strong>, а на закладке «Движения» укажем, что он является регистратором для регистров <strong>МетодыСписанияСебестоимости </strong>и <strong>ОстаткиНоменклатуры</strong>.</p>
  <figure id="0PyI" class="m_column">
    <img src="https://img4.teletype.in/files/70/52/70527804-09dd-4a51-a5c2-5c4e3e08953c.png" width="490" />
  </figure>
  <figure id="3oW0" class="m_column">
    <img src="https://img1.teletype.in/files/80/69/80697c3c-ffe8-4af4-b330-ff6845ec3581.png" width="490" />
  </figure>
  <figure id="l6vr" class="m_column">
    <img src="https://img1.teletype.in/files/c3/26/c326f324-34d3-46b1-ad18-5d7993c395a3.png" width="723" />
  </figure>
  <figure id="HtFh" class="m_column">
    <img src="https://img3.teletype.in/files/a1/02/a102ad1c-131f-4755-acbb-3ec6bda3ac3d.png" width="490" />
  </figure>
  <p id="dsb2">Переходим к описанию алгоритма проведения документа: прежде всего указываем, что все созданные нами движения нужно записывать, иначе весь наш труд пойдёт прахом.</p>
  <p id="6X5w">Далее, сразу же стираем старую запись в регистре сведений, чтобы прочитать какой метод списания устанавливают другие документы. Если они устанавливают другой метод, то записываем свой. Если наш документ не изменяет метод списания, то в принципе можно ничего не делать.</p>
  <p id="xDOO">Если наш документ изменяет прежний метод списания на метод списания <strong>ПоСредней</strong>, то приступаем к сворачиванию партий. Для этого прежде всего нужно прочитать все остатки по партиям на <strong>МоментВремени </strong>проведения документа. Прямо в запросе посчитаем суммарные остатки по каждой номенклатуре, чтобы не делать лишних движений.</p>
  <p id="FWJG">Дальше, во вложенном цикле пускаем в расход остатки по партиям, во внешнем цикле приходуем суммарные остатки по номенклатуре без указания партии.</p>
  <pre id="rmry" data-lang="sql">Процедура ОбработкаПроведения(Отказ, Режим)

    Движения.МетодыСписанияСебестоимости.Записывать = Истина;
    Движения.ОстаткиНоменклатуры.Записывать = Истина;

    Движения.МетодыСписанияСебестоимости.Записать();

    Если МетодСписанияСебестоимости
        &lt;&gt; РегистрыСведений.МетодыСписанияСебестоимости.ПолучитьПоследнее(Дата).Метод Тогда

        // регистр МетодыСписанияСебестоимости
        Движение = Движения.МетодыСписанияСебестоимости.Добавить();
        Движение.Период = Дата;
        Движение.Метод = МетодСписанияСебестоимости;

        Если МетодСписанияСебестоимости = Перечисления.УчетнаяПолитика.ПоСредней Тогда

            Запрос = Новый Запрос;
            Запрос.Текст =
                &quot;ВЫБРАТЬ
                |   ОстаткиНоменклатурыОстатки.Номенклатура КАК Номенклатура,
                |   ОстаткиНоменклатурыОстатки.Партия,
                |   ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоОстаток,
                |   ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК СтоимостьОстаток
                |ИЗ
                |   РегистрНакопления.ОстаткиНоменклатуры.Остатки(&amp;МоментВремени, )
                |       КАК ОстаткиНоменклатурыОстатки
                |
                |ИТОГИ
                |   СУММА(КоличествоОстаток),
                |   СУММА(СтоимостьОстаток)
                |ПО
                |   Номенклатура&quot;;

            Запрос.УстановитьПараметр(&quot;МоментВремени&quot;, МоментВремени());
            
            Движения.ОстаткиНоменклатуры.Записать();
            ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
            Пока ВыборкаНоменклатура.Следующий() Цикл
                ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();
                Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

                    // регистр ОстаткиНоменклатуры Расход
                    Движение = Движения.ОстаткиНоменклатуры.Добавить();
                    Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                    Движение.Период = Дата;
                    Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
                    Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
                    Движение.Количество = ВыборкаДетальныеЗаписи.КоличествоОстаток;
                    Движение.Стоимость = ВыборкаДетальныеЗаписи.СтоимостьОстаток;

                КонецЦикла;

                // регистр ОстаткиНоменклатуры Приход
                Движение = Движения.ОстаткиНоменклатуры.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
                Движение.Период = Дата;
                Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
                Движение.Количество = ВыборкаНоменклатура.КоличествоОстаток;
                Движение.Стоимость = ВыборкаНоменклатура.СтоимостьОстаток;

            КонецЦикла;
        КонецЕсли;
    КонецЕсли;

КонецПроцедуры</pre>
  <p id="SInh">Теперь посмотрим какие дополнения нам нужно сделать в алгоритме проведения документа приходная накладная. Во-первых, в самое начало процедуры <strong>ОбработкаПроведения </strong>воткнём чтение и проверку наличия сведений о методе списания себестоимости.</p>
  <p id="UynZ">Если таковых не имеется, отказываемся проводить документ и выходим из процедуры.</p>
  <pre id="Appt" data-lang="sql"> Метод = РегистрыСведений.МетодыСписанияСебестоимости.ПолучитьПоследнее(МоментВремени()).Метод;

    Если Метод = Перечисления.УчетнаяПолитика.ПустаяСсылка() Тогда

        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = &quot;Документ не может быть преведён, поскольку не определён метод списания себестоимости!&quot;;
        Сообщение.Сообщить(); 

        Отказ = Истина;
        Возврат;
	
    КонецЕсли;</pre>
  <p id="uJZL">Теперь отыскиваем строку кода, в которой указывается партия и выполняем её только если метод списания не <strong>ПоСредней</strong>.</p>
  <pre id="ZSFo" data-lang="sql">Если Не (Метод = Перечисления.УчетнаяПолитика.ПоСредней) Тогда
     Движение.Партия = Ссылка;
КонецЕсли;</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dc-zp/Ir4p9aC4iHk</guid><link>https://teletype.in/@dc-zp/Ir4p9aC4iHk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/Ir4p9aC4iHk?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>Задача 4</title><pubDate>Fri, 30 Jan 2026 12:57:26 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/7e/70/7e705c64-c3c9-4750-9c34-f00a68133a60.png"></media:content><category>1C</category><description><![CDATA[<img src="https://img4.teletype.in/files/38/9f/389f8aea-53c6-43e7-ba48-a51e3d23d13c.png"></img>Условие данной задачи является своеобразной комбинацией условий задач 3 и 1. Так, снова на сцене появляется учетная политика, которая действует год, а потом может смениться. Как и прежде, политика влияет на метод списания себестоимости (ФИФО/ЛИФО), а партия указывается в табличной части документа. Однако ничего не говорится про услуги и товары, и про то, что они могут указываться в одной табличной части.]]></description><content:encoded><![CDATA[
  <p id="waCC">Условие данной задачи является своеобразной комбинацией условий задач <a href="https://teletype.in/@dc-zp/SeQvIXLs9WC" target="_blank">3</a> и <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">1</a>. Так, снова на сцене появляется учетная политика, которая действует год, а потом может смениться. Как и прежде, политика влияет на метод списания себестоимости (ФИФО/ЛИФО), а партия указывается в табличной части документа. Однако ничего не говорится про услуги и товары, и про то, что они могут указываться в одной табличной части.</p>
  <p id="hzrJ">Основное требование - списывать товар из указанной в табличной части партии, а в случае если его по выбранной партии не хватает (или нет), то необходимо организовать списание в соответствии с текущей учетной политикой. Реализация этого требования и будет основной сложностью данной задачи, потому что со всем остальным нам уже приходилось сталкиваться.</p>
  <p id="PADg">Кроме того, необходимо построить пару отчетов, которые по своей сложности ничуть не превосходят те, с которыми мы имели дело в задачах <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">1</a> - <a href="https://teletype.in/@dc-zp/SeQvIXLs9WC" target="_blank">3</a>. Поэтому эти отчеты будут оставлены нами без внимания, а вместо них предлагаем детально обсудить нюансы, вытекающие из основного требования.</p>
  <hr />
  <p id="wriB">Суть проблемы заключается в так называемых «Дублях строк». Под этим термином обычно подразумевается, что пользователь дважды (или более) совершает одно и то же действие, например, списывает один и тот же товар. Возможно, он делает это по вполне объективным причинам. Например, одна часть товара продается по одной цене, а другая часть по другой цене. Но наличие повторов номенклатуры может существенно повлиять на логику программы.</p>
  <p id="cDq0">Например, пользователь дважды списывает по три единицы товара - итого шесть, а на складе остатки по двум партиям: в одной пять единиц, в другой две – итого семь. Если в запросе мы будем подбирать остатки к каждой записи о списании товара, то, поскольку записей две, мы подберём одни и те же остатки дважды. И каждый раз будем преспокойненько списывать по три единицы с первой партии, думая, что у нас ещё даже остается две единицы в запасе. То есть из-за дубля строк у нас происходит неявное задвоение остатков в алгоритме: четырнадцать вместо семи.</p>
  <figure id="ESko" class="m_original">
    <img src="https://img4.teletype.in/files/38/9f/389f8aea-53c6-43e7-ba48-a51e3d23d13c.png" width="900" />
  </figure>
  <p id="nnup">Чтобы не допускать такой ошибки, от «Дублей строк», по мере возможности, сразу избавляются. В предыдущих задачах вы могли видеть, что мы всегда группируем записи расходной накладной по номенклатуре. Таким образом, в нашем примере, вместо двух записей по три единицы мы получаем одну запись на шесть единиц. И естественно к одной записи мы и остаток подбираем один раз, в нашем примере семь единиц. Теперь не будет ни какой ошибки. Сразу видно: &quot;Шесть больше пяти - остатка не хватает&quot;, - нужно переходить к следующей партии.</p>
  <figure id="quy2" class="m_original">
    <img src="https://img3.teletype.in/files/23/65/23651a6b-76f8-459c-a333-b25a7265fde1.png" width="900" />
  </figure>
  <p id="Ndn0">В предыдущих задачах возможность сразу избавиться от «Дублей строк» у нас была, поскольку нигде в отчётах не требовалось знать какая часть товаров, по какой конкретно цене, была реализована: отчет Продажи составляется в целом по итогам указанного периода, а поскольку дубли строк встречаются в одном документе, они проводятся датой документа и попадают в один период.</p>
  <p id="rjp5">В этой задаче ситуация существенно отличная: «Дубли строк» могут отличаться не только ценой, но и указанной в них партией. Если в разных строках для одной и той же номенклатуры указана одна и та же партия, мы можем их сгруппировать. Но если в разных строках для одной и той же номенклатуры указаны разные партии, в этих партиях может не хватить товара и нам придётся подбирать остатки из других партий. Следовательно, у нас снова произойдет неявное задвоение остатков в алгоритме.</p>
  <figure id="oa9s" class="m_original">
    <img src="https://img4.teletype.in/files/b6/0b/b60b2dc4-254a-43d8-baf6-9c588cc46c4f.png" width="900" />
  </figure>
  <p id="fFIX">В задаче <a href="https://teletype.in/@dc-zp/GDY-1cJev1Z" target="_blank">2</a> партия указывалась в шапке документа и, следовательно, была одной и той же для любой строки табличной части - там такого произойти не могло. В задаче <a href="https://teletype.in/@dc-zp/SeQvIXLs9WC" target="_blank">3</a> мы не подбирали остатки из других партий и, следовательно, остатки по другим партиям не могли задваиваться. Как же нам поступить здесь?</p>
  <p id="aGl3">В принципе ответ очевиден: чтобы остатки не задваивались, мы должны подбирать их один лишь раз. А вот списывать с указанных партий мы должны персонально. То есть мы должны списать с указанных партий ровно столько, сколько указано и, если в них что-то останется, то тогда уже подбирать эти остатки для списания по методу указанному в учетной политике. Поскольку остатки подбираются один раз, нам нужно будет сгруппировать все записи по номенклатуре, потом со всех указанных партий списать (если хватает) указанное количество товара. Если в каких-то партиях товара не хватает, суммировать недостачу, и списывать её с других партий, в которых что-то ещё осталось.</p>
  <figure id="Tw1o" class="m_original">
    <img src="https://img1.teletype.in/files/03/63/03638fef-2045-4438-a253-e58e901464e8.png" width="900" />
  </figure>
  <p id="spo6">То есть с каждой партии товар может списываться дважды: первый раз в количестве не больше указанного, второй раз в порядке очерёдности согласно Учётной политике в пределах того, чего не хватило в указанных партиях. Значит, мы должны все остатки по партиям разбить на две части: 1) в пределах указанного, 2) сверх указанного. Первые части запрос должен располагать впереди в любом порядке, вторые - следом в порядке определённом Учётной политикой.</p>
  <p id="Teuc">Ну что ж, будем считать, что аналитические процедуры мы завершили успешно, переходим к реализации!</p>
  <hr />
  <p id="mlS4">Итак, особенность задачи в том лишь и состоит, что нам нужно исхитриться в одном пакетном запросе подготовить данные для алгоритма так, чтобы не пришлось менять его логику, отточенную в предыдущих задачах. Давайте приступим:</p>
  <p id="3aRj">В первом запросе пакета мы выберем данные из Расходной накладной, сгруппируем их по Номенклатуре и Партии, и поместим во временную таблицу РасходнаяНакладная. Во втором запросе пакета мы выберем данные из Расходной накладной, сгруппируем их по Номенклатуре, и поместим во временную таблицу РасходнаяНакладнаяБезПартий.</p>
  <p id="nftG">Поскольку нам придётся много работать с остатками, в третьем запросе пакета мы выберем их и поместим во временную таблицу ОстаткиНоменклатуры. Как водится, чтобы не читать лишнего и не перегружать компьютер бесполезной информацией, выбираем остатки только по той Номенклатуре, которая упоминается в Расходной накладной. И не забываем указать на какой момент времени нас интересуют остатки.</p>
  <p id="xhgK">Далее, определяем, сколько можно списать по указанной партии: Если остаток по партии больше чем требуется, списываем, сколько нужно, а нет, так списываем, сколько есть. Помещаем эту информацию во временную таблицу ДоступноДляСписания, с ней нам ещё придётся поработать.</p>
  <p id="nSKw">Потом мы объединяем данные запроса о том, сколько мы можем списать по партиям указанным в документе, с тем, что после этого останется. И тут же определяем Порядок сортировки. Для доступных для списания данных используем 0, они будут первыми. А для сортировки того, что остается, используем 1. Помещаем результат объединения во временную таблицу ПартииДляСписания.</p>
  <p id="QHw8">В последнем запросе мы соединяем данные расходной накладной, с подготовленными данными об остатках. Сортируем по ранее определённому полю Порядку, потом по моменту времени Партии в порядке, определяемом учетной политикой. Создаем итоги по Номенклатуре. Всё, пакет запросов готов!</p>
  <p id="8I8c">И вот, что у нас должно было получиться:</p>
  <pre id="JF6C" data-lang="sql">Запрос = Новый Запрос;
Запрос.Текст =&quot;ВЫБРАТЬ
|	РасходнаяНакладнаяСписокНоменклатуры.Номенклатура КАК Номенклатура,
|	РасходнаяНакладнаяСписокНоменклатуры.Партия,
|	СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
|	СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
|ПОМЕСТИТЬ РасходнаяНакладная
|ИЗ
|	Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
|ГДЕ
|	РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &amp;Ссылка
|
|СГРУППИРОВАТЬ ПО
|	РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
|	РасходнаяНакладнаяСписокНоменклатуры.Партия
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	РасходнаяНакладная.Номенклатура,
|	СУММА(РасходнаяНакладная.Количество) КАК Количество,
|	СУММА(РасходнаяНакладная.Сумма) КАК Сумма
|ПОМЕСТИТЬ РасходнаяНакладнаяБезПартий
|ИЗ
|	РасходнаяНакладная КАК РасходнаяНакладная
|
|СГРУППИРОВАТЬ ПО
|	РасходнаяНакладная.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	ОстаткиНоменклатурыОстатки.Номенклатура,
|	ОстаткиНоменклатурыОстатки.Партия,
|	ОстаткиНоменклатурыОстатки.КоличествоОстаток,
|	ОстаткиНоменклатурыОстатки.СтоимостьОстаток
|ПОМЕСТИТЬ ОстаткиНоменклатуры
|ИЗ
|	РегистрНакопления.ОстаткиНоменклатуры.Остатки(
|			&amp;МоментВремени,
|			Номенклатура В
|				(ВЫБРАТЬ
|					РасходнаяНакладнаяБезПартий.Номенклатура
|				ИЗ
|					РасходнаяНакладнаяБезПартий)) КАК ОстаткиНоменклатурыОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	РасходнаяНакладная.Номенклатура,
|	РасходнаяНакладная.Партия,
|	ВЫБОР
|		КОГДА РасходнаяНакладная.Количество &gt; ОстаткаНоменклатуры.КоличествоОстаток
|			ТОГДА ОстаткаНоменклатуры.КоличествоОстаток
|		ИНАЧЕ РасходнаяНакладная.Количество
|	КОНЕЦ КАК ДоступноКоличество,
|	ВЫБОР
|		КОГДА РасходнаяНакладная.Количество &gt; ОстаткаНоменклатуры.КоличествоОстаток
|			ТОГДА ОстаткаНоменклатуры.СтоимостьОстаток
|		ИНАЧЕ РасходнаяНакладная.Количество * ОстаткаНоменклатуры.СтоимостьОстаток / 
|                                                           ОстаткаНоменклатуры.КоличествоОстаток
|	КОНЕЦ КАК ДоступноСтоимость
|ПОМЕСТИТЬ ДоступноДляСписания
|ИЗ
|	РасходнаяНакладная КАК РасходнаяНакладная
|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОстаткиНоменклатуры КАК ОстаткаНоменклатуры
|		ПО РасходнаяНакладная.Номенклатура = ОстаткаНоменклатуры.Номенклатура
|			И РасходнаяНакладная.Партия = ОстаткаНоменклатуры.Партия
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	0 КАК Порядок,
|	ДоступноДляСписания.Номенклатура,
|	ДоступноДляСписания.Партия,
|	ДоступноДляСписания.ДоступноКоличество КАК КоличествоОстаток,
|	ДоступноДляСписания.ДоступноСтоимость КАК СтоимостьОстаток
|ПОМЕСТИТЬ ПартииДляСписания
|ИЗ
|	ДоступноДляСписания КАК ДоступноДляСписания
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
|	1,
|	ОстаткаНоменклатуры.Номенклатура,
|	ОстаткаНоменклатуры.Партия,
|	ОстаткаНоменклатуры.КоличествоОстаток - ЕСТЬNULL(ДоступноДляСписания.ДоступноКоличество, 0),
|	ОстаткаНоменклатуры.СтоимостьОстаток - ЕСТЬNULL(ДоступноДляСписания.ДоступноСтоимость, 0)
|ИЗ
|	ОстаткиНоменклатуры КАК ОстаткаНоменклатуры
|		ЛЕВОЕ СОЕДИНЕНИЕ ДоступноДляСписания КАК ДоступноДляСписания
|		ПО (ДоступноДляСписания.Номенклатура = ОстаткаНоменклатуры.Номенклатура)
|			И (ДоступноДляСписания.Партия = ОстаткаНоменклатуры.Партия)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	РасходнаяНакладнаяБезПартий.Номенклатура КАК Номенклатура,
|	РасходнаяНакладнаяБезПартий.Количество КАК Количество,
|	РасходнаяНакладнаяБезПартий.Сумма КАК Сумма,
|	ПартииДляСписания.Порядок КАК Порядок,
|	ПартииДляСписания.Партия,
|	ЕСТЬNULL(ПартииДляСписания.КоличествоОстаток, 0) КАК КоличествоОстаток,
|	ЕСТЬNULL(ПартииДляСписания.СтоимостьОстаток, 0) КАК СтоимостьОстаток
|ИЗ
|	РасходнаяНакладнаяБезПартий КАК РасходнаяНакладнаяБезПартий
|		ЛЕВОЕ СОЕДИНЕНИЕ ПартииДляСписания КАК ПартииДляСписания
|		ПО РасходнаяНакладнаяБезПартий.Номенклатура = ПартииДляСписания.Номенклатура
|ГДЕ
|	ПартииДляСписания.КоличествоОстаток &gt; 0
|
|УПОРЯДОЧИТЬ ПО
|	Порядок,
|	ПартииДляСписания.Партия.МоментВремени &quot;+?(МетодСписания=Перечисления.УчетнаяПолитика.ФИФО, &quot;ВОЗР&quot;, &quot;УБЫВ&quot;)+&quot;
|ИТОГИ
|	МАКСИМУМ(Количество),
|	МАКСИМУМ(Сумма),
|	СУММА(КоличествоОстаток)
|ПО
|	Номенклатура&quot;;</pre>
  <p id="BfnK">Алгоритм проведения можем взять хотя бы из задачи <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">1</a> Только нужно будет устранить из него всё, что касается услуг.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dc-zp/SeQvIXLs9WC</guid><link>https://teletype.in/@dc-zp/SeQvIXLs9WC?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/SeQvIXLs9WC?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>Задача 3</title><pubDate>Fri, 30 Jan 2026 12:35:04 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/a6/8f/a68fb44b-5f89-4b97-a039-b3232db956f7.png"></media:content><category>1C</category><description><![CDATA[<img src="https://img2.teletype.in/files/5d/c4/5dc4ce87-743b-40f0-9b45-8267f8fd488a.png"></img>Условие данной задачи во многом повторяет условие задачи 1. Отличие заключается в том, что учетная политика (ФИФО/ЛИФО) не ведется, а просто в табличной части документа РасходнаяНакладная для каждого товара пользователь указывает партию, которую необходимо списать. В том случае, если товара по указанной партии не хватает, то документ не проводится и выводится соответствующее сообщение о нехватке.]]></description><content:encoded><![CDATA[
  <p id="1anA">Условие данной задачи во многом повторяет условие <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">задачи 1.</a> Отличие заключается в том, что учетная политика (ФИФО/ЛИФО) не ведется, а просто в табличной части документа <strong>РасходнаяНакладная </strong>для каждого товара пользователь указывает партию, которую необходимо списать. В том случае, если товара по указанной партии не хватает, то документ не проводится и выводится соответствующее сообщение о нехватке.</p>
  <p id="AVK8">Необходимо построить отчет по анализу продаж товаров за период и остаткам товара на указанную дату. Ориентировочный вид обоих отчетов приведен ниже:</p>
  <figure id="CUFh" class="m_column">
    <img src="https://img2.teletype.in/files/5d/c4/5dc4ce87-743b-40f0-9b45-8267f8fd488a.png" width="1090" />
  </figure>
  <figure id="pgFD" class="m_column">
    <img src="https://img3.teletype.in/files/a2/c4/a2c4a799-2bf4-4268-a1ed-9d79c44f7bb2.png" width="1090" />
  </figure>
  <p id="AA4t">Где:<br /> Интервал = «Дата первой отгрузки» - «Дата последней отгрузки» / «Количество отгрузок» (или &quot;разовая&quot;, если «Количество отгрузок» = 1)<br /> Срок = «Конец периода отчета» - «Дата последней отгрузки»</p>
  <hr />
  <p id="i3Q4">Очевидно, что мы имеем дело еще с одной небольшой вариацией задачи 1, <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">решение</a> которой возьмем за основу. Т.к. учетная политика здесь отсутствует как таковая, то первым делом выкинем из конфигурации одноименный регистр сведений. А также уберем из обработки проведения документа <strong>РасходнаяНакладная </strong>обращение к этому регистру и сортировку партий в запросе.</p>
  <p id="ggnP">В задаче требуется списывать не все доступные партии, а только те, что указаны в табличной части документа <strong>РасходнаяНакладная</strong>, поэтому добавим в его табличную часть <strong>СписокНоменклатуры </strong>новый реквизит <strong>Партия </strong>типа <strong>ДокументСсылка.ПриходнаяНакладная</strong>. Т.к. по условию задачи услуги и товары указываются в одной табличной части, то свойство <strong>Проверка заполнения</strong> нового реквизита оставим имеющим значение <strong>Не проверять</strong>. Подправим текст запроса таким образом, чтобы он возвращал остатки сразу для пары {номенклатура, партия} (новые строки выделены 4мя вертикальными полосками ||||):</p>
  <pre id="p3uR" data-lang="sql">    // Чтение партий, доступных для списания.
    Запрос = Новый Запрос;
    Запрос.Текст =
        &quot;ВЫБРАТЬ
        |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
        ||||   РасходнаяНакладнаяСписокНоменклатуры.Партия,
        |   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
        |   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
        |ПОМЕСТИТЬ РасходнаяНакладная
        |ИЗ
        |   Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
        |ГДЕ
        |   РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &amp;Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга,
        ||||   РасходнаяНакладнаяСписокНоменклатуры.Партия
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   РасходнаяНакладная.Номенклатура КАК Номенклатура,
        |   ВЫБОР КОГДА РасходнаяНакладная.ВидНоменклатуры = Значение(Перечисление.ВидНоменклатуры.Услуга) ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ КАК ЭтоУслуга,
        ||||   РасходнаяНакладная.Партия КАК Партия,
        |   РасходнаяНакладная.Количество КАК Количество,
        |   РасходнаяНакладная.Сумма,
        |   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
        |   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток
        |ИЗ
        |   РасходнаяНакладная КАК РасходнаяНакладная
        |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
        |               &amp;МоментВремени,
        ||||               (Номенклатура, Партия) В
        ||||                   (ВЫБРАТЬ
        ||||                       РасходнаяНакладная.Номенклатура,
        ||||                       РасходнаяНакладная.Партия
        ||||                   ИЗ
        ||||                       РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки
        ||||       ПО РасходнаяНакладная.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
        ||||           И РасходнаяНакладная.Партия = ОстаткиНоменклатурыОстатки.Партия
        ||||ИТОГИ
        ||||	МИНИМУМ(ЭтоУслуга),
        ||||	МИНИМУМ(Количество),
        ||||	МИНИМУМ(Сумма)
        ||||ПО
        ||||	Номенклатура&quot;;

    Запрос.УстановитьПараметр(&quot;Ссылка&quot;, Ссылка);
    Запрос.УстановитьПараметр(&quot;МоментВремени&quot;, МоментВремени());</pre>
  <p id="r2AW">Заметим, что в запросе отсутствует упорядочивание. Дело в том, что для каждой пары {номенклатура, партия} из табличной части мы выбираем из регистра не список партий (как в задачах <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">1</a> или <a href="https://teletype.in/@dc-zp/GDY-1cJev1Z" target="_blank">2</a>), а только одну партию.</p>
  <p id="mFox">Однако мы продолжаем формировать итоги по номенклатуре, потому что ни что не мешает пользователю задать в табличной части отгрузку одного и того же товара из разных партий. Тогда как в регистре <strong>Продажи </strong>партии не указываются, а списывается суммарная стоимость и количество по всем партиям.</p>
  <p id="PAiP">Но при этом мы, конечно же, не подсчитываем суммарный остаток по всем партиям, указанным для данной номенклатуры, поскольку необходимо контролировать наличие остатков достаточных для отгрузки, по каждой партии в отдельности.</p>
  <p id="lbwq">Одним из важнейших аспектов программирования является правильная блокировка данных. Здесь мы продемонстрируем использование управляемой блокировки. В регистре накопления <strong>ОстаткиНоменклатуры </strong>блокируются все указанные в табличной части документа <strong>СписокНоменклатуры </strong>сочетания номенклатуры и партии. То есть другой документ сможет списывать другую номенклатуру с той же партии и ту же номенклатуру с другой партии. Таким образом, мы блокируем только то, что нам понадобится, И позволяем другим документам беспрепятственно работать со всем остальным.</p>
  <p id="FSzv">Перед тем как выполнить чтение данных из регистра <strong>ОстаткиНоменклатуры</strong>, мы стираем прежние движения этого документа, если они были, записывая пустой набор движений. Но ещё прежде мы указываем, что все остатки и обороты, на которые влияли наши прежние движения, следует <strong>БлокироватьДляИзменения</strong>. Это на тот случай, если по итогам проверки остатков в партиях, мы решимся отказаться от записи новых движений и вернуть прежние. Ведь пока мы производим проверки и формируем движения, другой документ может забрать то, что временно освободилось, когда мы стерли прежние движения.</p>
  <pre id="MMP0" data-lang="sql">    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить(&quot;РегистрНакопления.ОстаткиНоменклатуры&quot;);
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(&quot;Номенклатура&quot;, &quot;Номенклатура&quot;);
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(&quot;Партия&quot;, &quot;Партия&quot;);
    Блокировка.Заблокировать();
   
    Движения.ОстаткиНоменлатуры.Записывать = Истина;
    Движения.ОстаткиНоменклатуры.Записать();</pre>
  <p id="3d5J">Ну, вот теперь мы можем смело читать остатки и приступать к формированию движений. В принципе это делается также, как и в задаче <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">1</a>, только проверка наличия остатков погружается в цикл обхода детальных записей, не требуется контролировать сколько осталось списать, а сам этот цикл выполняется только когда номенклатура не является услугой.</p>
  <pre id="1gBI" data-lang="sql">    Результат = Запрос.Выполнить();
    ВыборкаНоменклатура = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

    Пока ВыборкаНоменклатура.Следующий() Цикл

        ТекСебестоимость = 0;

        Если НЕ ВыборкаНоменклатура.ЭтоУслуга Тогда 

        ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();

            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

                // Контроль остатков
                Если ВыборкаНоменклатура.Количество &gt; ВыборкаНоменклатура.КоличествоОстаток Тогда
              
                    Сообщение = Новый СообщениеПользователю;
                    Сообщение.Текст = &quot;В партии &quot; + ВыборкаДетальныеЗаписи.Партия
                                    + &quot; не хватает &quot;&quot;&quot; + ВыборкаДетальныеЗаписи.Номенклатура
                                    + &quot;&quot;&quot;. Требуется: &quot; + ВыборкаДетальныеЗаписи.Количество
                                    + &quot;, остаток: &quot; + ВыборкаДетальныеЗаписи.КоличествоОстаток + &quot;.&quot;;
                    Сообщение.Сообщить();

                    Отказ = Истина;
                КонецЕсли;

                Если Отказ Тогда
                    Продолжить;
                КонецЕсли;

                // регистр ОстаткиНоменклатуры Расход
                Движение = Движения.ОстаткиНоменклатуры.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;
                Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
                Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
                Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
                Движение.Стоимость = (ВыборкаДетальныеЗаписи.Количество * ВыборкаДетальныеЗаписи.СтоимостьОстаток) /
                                                            ВыборкаДетальныеЗаписи.КоличествоОстаток;

                ТекСебестоимость = ТекСебестоимость + Движение.Стоимость;
            КонецЦикла;
        КонецЕсли;
        
        // регистр Продажи
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
        Движение.Количество = ВыборкаНоменклатура.Количество;
        Движение.Себестоимость = ТекСебестоимость;
        Движение.Выручка = ВыборкаНоменклатура.Сумма;
        КонецЦикла;</pre>
  <p id="Mcg9">Отчет «Остатки товаров» полностью совпадает с одноименным отчетом задачи <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">1</a>, поэтому его реализация рассматриваться здесь не будет. Создадим новый отчет АнализПродаж, добавим его в подсистему Оперативный учет, а затем на вкладке «Основные» нажмем кнопку «Открыть схему компоновки данных». В схему добавим набор данных вида «Запрос». Укажем следующий текст запроса:</p>
  <pre id="NE0a" data-lang="sql">ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    МИНИМУМ(ПродажиОбороты.Период) КАК Минимум,
    МАКСИМУМ(ПродажиОбороты.Период) КАК Максимум,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПродажиОбороты.Регистратор) КАК N,
    СУММА(ПродажиОбороты.КоличествоОборот) КАК Количество,
    СУММА(ПродажиОбороты.ВыручкаОборот) КАК Продажа,
    СУММА(ПродажиОбороты.СебестоимостьОборот) КАК Себестоимость
ИЗ
    РегистрНакопления.Продажи.Обороты(, , Регистратор, ) КАК ПродажиОбороты

СГРУППИРОВАТЬ ПО
    ПродажиОбороты.Номенклатура</pre>
  <p id="4exh">Запрос вернет основные данные для нашего отчета, но часть необходимой нам информации - поля Прибыль/Интервал/Срок - среди них отсутствуют. Ничто не мешает усложнить запрос таким образом, чтобы он возвращал все, что нам нужно. Но мы предпочитаем действовать иначе, а именно - собираемся вычислять значения этих полей в самой схеме компоновки данных. Для этого перейдем на вкладку «Вычисляемые поля» и внесем на ней ряд изменении:</p>
  <figure id="CfK3" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ac/c5/acc5fa35-4cd7-416b-b542-85ff0d9ae793.png" width="1090" />
    <figcaption>Закладка &quot;Вычисляемые поля&quot; отчета АнализПродаж</figcaption>
  </figure>
  <p id="Qk9i">Перейдем на закладку «Параметры». Установим параметры отчета согласно рисунка.</p>
  <figure id="ZRJx" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/02/ad/02ad2249-5f2e-43a4-8068-3a2cda09d93e.png" width="1090" />
    <figcaption>Закладка &quot;Параметры&quot; отчета АнализПродаж</figcaption>
  </figure>
  <p id="cBQb">Перейдем на закладку «Настройки». Добавим в структуру нашего отчета новую группировку (клавиша Ins), но поле группировки указывать не будем (клавиша Enter). На вкладке «Выбранные поля» укажем список полей отчета, согласно требуемой формы.</p>
  <figure id="PP94" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/87/b4/87b47cd4-99f9-4936-8256-2dd6fc800918.png" width="1090" />
    <figcaption>Закладная &quot;Выбранные поля&quot; настроек отчета АнализПродаж</figcaption>
  </figure>
  <p id="wogI">Рядом с вкладкой «Выбранные поля» расположена вкладка «Параметры». Перейдем на нее и выполним настройку параметра «Период» отчета.</p>
  <figure id="8C0h" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fd/3c/fd3c64bf-9a69-4b62-bd05-1e7dfcb75e36.png" width="1090" />
    <figcaption>Закладная &quot;Параметры&quot; настроек отчета АнализПродаж</figcaption>
  </figure>
  <p id="fAzm">Последний штрих - переходим на вкладку «Другие настройки» и задаем заголовок отчета.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dc-zp/GDY-1cJev1Z</guid><link>https://teletype.in/@dc-zp/GDY-1cJev1Z?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/GDY-1cJev1Z?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>Задача 2</title><pubDate>Fri, 30 Jan 2026 10:51:01 GMT</pubDate><category>1C</category><description><![CDATA[Условие данной задачи повторяет практически дословно условие задачи 1. Отличие заключается в том, что при списании себестоимости помимо учетной политики, нужно принимать во внимание еще и указанную в документе (в шапке документа) партию. В первую очередь требуется списываться товар из указанной в шапке партии. В случае, если товара по выбранной партии не хватает (или нет), то товар должен списываться в соответствии с текущей учетной политикой.]]></description><content:encoded><![CDATA[
  <p id="UK4e">Условие данной задачи повторяет практически дословно условие <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">задачи 1</a>. Отличие заключается в том, что при списании себестоимости помимо учетной политики, нужно принимать во внимание еще и указанную в документе (в шапке документа) партию. В первую очередь требуется списываться товар из указанной в шапке партии. В случае, если товара по выбранной партии не хватает (или нет), то товар должен списываться в соответствии с текущей учетной политикой.</p>
  <hr />
  <p id="OhhG">Очевидно, что мы имеем дело с ситуацией, когда небольшая вариация условия задачи приводит к аналогичным по масштабу изменениям в решении. Решение задачи 1 нами было подробно описано в соответствующем <a href="https://teletype.in/@dc-zp/RtK8q4woQEE" target="_blank">разделе</a>, возьмем его за основу. Рассмотрим изменения, которые необходимо дополнительно в него внести.</p>
  <p id="2fxd">Во-первых, в документ <strong>РасходнаяНакладная </strong>нам потребуется добавить реквизит <strong>Партия </strong>типа <strong>ДокументСсылка.ПриходнаяНакладная</strong>. Т.к. в условии задачи ничто не говорит о том, что этот реквизит может не заполняться, то установим его свойство Проверка заполнения в значение <strong>Выдавать ошибку</strong>.</p>
  <p id="gxmj">Второе (и последнее) изменение, которое нам предстоит сделать - это подправить немного текст запроса в обработке проведения документа <strong>РасходнаяНакладная</strong>. Напомним, что сейчас запрос получает список партий, доступных для списания, а также сортирует его согласно текущей учетной политики (<u>ФИФО </u>- по возрастанию дат партий, <u>ЛИФО </u>- по убыванию дат партий).</p>
  <p id="Oj31">В это список может попасть и наша партия - та, что указана в шапке документа <strong>РасходнаяНакладная</strong>. Только при любом методе сортировки нам нужно, чтобы она оказалась на первом месте (если по ней есть что списывать, естественно). Тогда бы, мы первым делом списали товар именно из этой партии, а потом бы перешли к прочим, уже отсортированным как надо. Реализуем это так (новые строки выделены 4мя вертикальными линиями ||||):</p>
  <pre id="lY4U" data-lang="sql">   // Чтение партий, доступных для списания. 
   //Сортировка согласно требованию
    Запрос = Новый Запрос;
    Запрос.Текст =
        &quot;ВЫБРАТЬ
        |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
        |   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
        |   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
        |ПОМЕСТИТЬ РасходнаяНакладная
        |ИЗ
        |   Документ.РасходнаяНакладная.СписокНоменклатуры КАК РасходнаяНакладнаяСписокНоменклатуры
        |ГДЕ
        |   РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &amp;Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
        |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   РасходнаяНакладная.Номенклатура КАК Номенклатура,
        |   ВЫБОР КОГДА РасходнаяНакладная.ВидНоменклатуры = Значение(Перечисление.ВидНоменклатуры.Услуга) ТОГДА Истина ИНАЧЕ Ложь КОНЕЦ КАК ЭтоУслуга,
        |   РасходнаяНакладная.Количество КАК Количество,
        |   РасходнаяНакладная.Сумма,
        |   ОстаткиНоменклатурыОстатки.Партия КАК Партия,
        ||||   ВЫБОР
        ||||       КОГДА ОстаткиНоменклатурыОстатки.Партия = &amp;Партия
        ||||           ТОГДА 0
        ||||       ИНАЧЕ 1
        ||||   КОНЕЦ КАК Порядок,
        |   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
        |   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток
        |ИЗ
        |   РасходнаяНакладная КАК РасходнаяНакладная
        |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
        |               &amp;МоментВремени,
        |               Номенклатура В
        |                   (ВЫБРАТЬ
        |                       РасходнаяНакладная.Номенклатура
        |                   ИЗ
        |                       РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки
        |       ПО РасходнаяНакладная.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
        |
        |УПОРЯДОЧИТЬ ПО
        ||||   Порядок,
        |   ОстаткиНоменклатурыОстатки.Партия.МоментВремени&quot; + СортировкаПартий + &quot;
        |ИТОГИ
        |   МАКСИМУМ(Услуга),
        |   МАКСИМУМ(Количество),
        |   МАКСИМУМ(Сумма),
        |   СУММА(КоличествоОстаток)
        |ПО
        |   Номенклатура&quot;;        
    Запрос.УстановитьПараметр(&quot;Ссылка&quot;, Ссылка);
    Запрос.УстановитьПараметр(&quot;МоментВремени&quot;, МоментВремени());
    ||||Запрос.УстановитьПараметр(&quot;Партия&quot;, Партия);</pre>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dc-zp/RtK8q4woQEE</guid><link>https://teletype.in/@dc-zp/RtK8q4woQEE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/RtK8q4woQEE?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>Задача 1</title><pubDate>Fri, 30 Jan 2026 10:07:33 GMT</pubDate><media:content medium="image" url="https://img4.teletype.in/files/b3/66/b3669b86-dfe9-4a73-923e-a0efe45f4f88.png"></media:content><category>1C</category><description><![CDATA[<img src="https://img3.teletype.in/files/ab/16/ab168f17-c906-4d2f-ba97-05a31a85c750.png"></img>Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа – «Расходная накладная». Помимо, продажи товара, могут оказываться дополнительные услуги, например, по доставке. И услуги, и товары указываются в одной табличной части.]]></description><content:encoded><![CDATA[
  <p id="G70W">Компания занимается оптовой торговлей. Поступление товаров отражается документом «Приходная накладная», продажа – «Расходная накладная». Помимо, продажи товара, могут оказываться дополнительные услуги, например, по доставке. И услуги, и товары указываются в одной табличной части.</p>
  <p id="0OJT">Складной учет не ведется.</p>
  <p id="tz2i">При проведении расходной накладной при нехватке товара необходимо выдавать соответствующее предупреждение с указанием количества нехватки и не позволять проводить документ.</p>
  <p id="2vjo">Списание себестоимости должно быть организованно по партиям, в Зависимости от значения, принятого на этот год в учетной политике Метода списания себестоимости (FIFO или LIFO). Еще раз подчеркивается – Учетная политика действует год. На следующий год метод списания может смениться.</p>
  <p id="q6eQ">Необходимо построить отчет по продажам товаров за период и остаткам товаров на указанную дату. Ориентировочный вид обоих отчетов приведен ниже:</p>
  <figure id="ztD2" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/ab/16/ab168f17-c906-4d2f-ba97-05a31a85c750.png" width="1090" />
    <figcaption>Отчет по продажам за период</figcaption>
  </figure>
  <figure id="dtGt" class="m_column" data-caption-align="center">
    <img src="https://img3.teletype.in/files/a2/c4/a2c4a799-2bf4-4268-a1ed-9d79c44f7bb2.png" width="1090" />
    <figcaption>Отчет по остаткам товаров на указанную дату</figcaption>
  </figure>
  <hr />
  <p id="88Cf">Переводим режим управления блокировкой данных каркасной конфигурации в значение <strong>Управляемый</strong>. Находим в дереве конфигурации элемент <strong>Общие | Подсистемы</strong>, создаем подчиненную подсистему <strong>ОперативныйУчет </strong>с одноименной картинкой, а затем две вложенные в нее подсистемы <strong>Документы </strong>и <strong>Справочники</strong>. Для последних задавать картинки не будем. Включим справочники <strong>Номенклатура </strong>и <strong>Контрагенты </strong>в подсистему <strong>Справочники</strong>, а документы <strong>ПриходнаяНакладная </strong>и <strong>РасходнаяНакладная </strong>в подсистему <strong>Документы</strong>.</p>
  <p id="wbR2">В справочнике Номенклатура создаем новый реквизит <strong>ВидНоменклатуры</strong> типа <strong>ПеречислениеСсылка.ВидыНоменклатуры</strong>. Номенклатуре используемой в примере необходимо проставить вид<strong> ВидыНоменклатуры.Товар</strong>.</p>
  <p id="xEBZ">Для хранения текущего значения принятого на этот год в учетной политике метода списания себестоимости создадим регистр сведений <strong>УчетнаяПолитика</strong>. Периодичность - <strong>В пределах года</strong>, т.к. в задаче не сказано, что изменение учетной политики должно фиксироваться соответствующим документом, то оставляем <strong>Режим записи регистра</strong> без изменения (<strong>Независимый</strong>). Добавим регистр в подсистему <strong>ОперативныйУчет</strong>, а на закладке «Данные» создадим ресурс <strong>МетодСписания</strong> типа <strong>ПеречислениеСсылка.УчетнаяПолитика</strong>.</p>
  <p id="xphN">Сохраним изменения в конфигурации, проигнорировав список предупреждений вида «Объект не включен ни в одну подсистему, отображаемую в командном интерфейсе». В режиме 1С:Предприятия добавим в справочник <strong>Номенклатура </strong>новую группу Услуги, а в нее элемент - Доставка. Для номенклатуры Доставка укажем вид номенклатуры - <strong>Услуга. </strong>Далее, перейдем по ссылке <strong>Учетная политика</strong>, создадим в списке новый элемент, в котором укажем метод списания себестоимости <strong>Фифо</strong>.</p>
  <p id="iw5e">Вернемся в режим Конфигуратора. Посмотрим внимательно на форму первого отчета и зададим себе вопрос о том, откуда будут браться данные для его формирования. Т.к. продажи - это по своей сути оборотная информация, то решим, что данные будут браться из соответствующего оборотного регистра накопления (назовем его <strong>Продажи</strong>), причем форма отчета диктует нам структуру этого регистра.</p>
  <figure id="641I" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b6/da/b6da6e4f-5d91-4fea-8235-572c74eb088f.png" width="1042" />
    <figcaption>Структура оборотного регистра накомления Продажи</figcaption>
  </figure>
  <p id="A2wO">Аналогично, посмотрим внимательно на форму второго отчета и зададим себе вопрос о том, откуда будут браться данные для его формирования. Решим, что данные будут браться из соответствующего регистра накопления вида Остатки (назовем его <strong>ОстаткиНоменклатуры</strong>). В каркасной конфигурации уже присутствует регистр с таким именем, поэтому внесем требуемые изменения прямо в него.</p>
  <figure id="fFvT" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/f3/02/f30244a7-c8c2-48fd-8890-92bf0184e123.png" width="1090" />
    <figcaption>Структура остаточного регистра накопления ОстаткиНоменклатуры</figcaption>
  </figure>
  <p id="PLTM">В регистре <strong>ОстаткиНоменклатуры </strong>измерение <strong>Партия </strong>будет иметь тип <strong>ДокументСсылка.ПриходнаяНакладная</strong>. Другими словами, мы собираемся хранить остатки номенклатуры в разрезе конкретных документов <strong>ПриходнаяНакладная</strong>, по которым эта номенклатура к нам поступала. Например, на основе данных второго отчета можно сделать вывод, что приход номенклатуры «Big (капилярная)» происходил по документам «Приходная накладная 000000001» и «Приходная накладная 000000002», по каждому из них мы собираемся хранить текущий остаток номенклатуры и стоимость. Это и есть партионный учет, требуемый в задаче!</p>
  <p id="OUlQ">Перейдем к реализации логики проведения документов <strong>ПриходнаяНакладная </strong>и <strong>РасходнаяНакладная</strong>. Начнем с первого, для этого откроем модуль объекта документа <strong>ПриходнаяНакладная </strong>и добавим в него следующий код:</p>
  <pre id="hbKp" data-lang="sql">Процедура ОбработкаПроведения(Отказ, Режим)
    Движения.ОстаткиНоменклатуры.Записывать = Истина;

    // Получаем данные по Товарам документа и одновременно избавляемся
    // от дублей строк
    Запрос = Новый Запрос;
    Запрос.Текст =
    &quot;ВЫБРАТЬ
    |   ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура,
    |   СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
    |   СУММА(ПриходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
    |ИЗ
    |   Документ.ПриходнаяНакладная.СписокНоменклатуры КАК ПриходнаяНакладнаяСписокНоменклатуры
    |ГДЕ
    |   ПриходнаяНакладнаяСписокНоменклатуры.Ссылка = &amp;Ссылка
    |   И (НЕ ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура.Услуга)
    |
    |СГРУППИРОВАТЬ ПО
    |   ПриходнаяНакладнаяСписокНоменклатуры.Номенклатура&quot;;

    Запрос.УстановитьПараметр(&quot;Ссылка&quot;, Ссылка);

    Результат = Запрос.Выполнить();

    ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл

        // регистр ОстаткиНоменклатуры Приход
        Движение = Движения.ОстаткиНоменклатуры.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
        Движение.Период = Дата;
        Движение.Партия = Ссылка;
        Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
        Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
        Движение.Стоимость = ВыборкаДетальныеЗаписи.Сумма;
    КонецЦикла;
КонецПроцедуры</pre>
  <p id="AIQ2">Можно заметить, что логика проведения довольно прямолинейна, поэтому не требует дополнительных пояснений. Проведение документа <strong>РасходнаяНакладная </strong>немногим сложнее, но прежде чем переходить к нему, разберемся, как именно оно должно выглядеть, согласно требованиям задачи.</p>
  <p id="zFQz"><strong>РасходнаяНакладная </strong>должна уменьшать остатки номенклатуры в регистре <strong>ОстаткиНоменклатуры</strong>, а также создавать движения в регистре <strong>Продажи</strong>. Причем, остатки номенклатуры у нас хранятся в разрезе партий (документов ПриходнаяНакладная), поэтому перед списанием номенклатуры необходимо будет получить из регистра список партий, доступных для списания. В соответствии с установленным значением на этот год в учетной политике методом списания себестоимости, будем сортировать этот список партий или по возрастанию дат документов (<u>ФИФО </u>- первый пришел, первый ушел), или по убыванию дат документов (<u>ЛИФО </u>- последний пришел, первый ушел).</p>
  <p id="tOg1">Кроме того, при проведении документа <strong>РасходнаяНакладная </strong>требуется отслеживать нехватку товара. Для того чтобы понять хватает ли товара для проведения документа, неэффективно бегать по его списку партий. Лучшим решением будет озаботиться тем, чтобы у нас всегда были бы под рукой данные об общем количестве доступных единиц товара.</p>
  <p id="cxnP">Наконец, для исключения коллизий, связанных с параллельной работой других пользователей, реализуем блокировку необходимых данных. Дело в том, что возможна такая ситуация, когда разные транзакции одновременно читают доступное количество некоего товара, а потом каждая транзакция списывает его. В результате чего контроль остатков будет работать неверно, а наша обязанность этого избежать. Поэтому, прежде чем читать что-то, что мы собираемся изменять, будем запрещать чтение этих данных другими транзакциями до тех пор, пока мы не закончим свои изменения (или пока не откажемся от проведения документа).</p>
  <pre id="6b7l" data-lang="sql">Процедура ОбработкаПроведения(Отказ, Режим)

    // Чтение метода списания себестоимости
    МетодСписания = РегистрыСведений.УчетнаяПолитика.
    ПолучитьПоследнее(Дата).МетодСписания;

    Если МетодСписания.Пустая() Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = &quot;Учетная политика не определена!&quot;;
        Сообщение.Сообщить();

        Отказ = Истина;
        Возврат;
    КонецЕсли;

  СортировкаПартий = ?(МетодСписания = Перечисления.УчетнаяПолитика.ФИФО, 
  &quot;&quot;, &quot; УБЫВ&quot;);
    
    Движения.Продажи.Записывать = Истина;
    Движения.ОстаткиНоменклатуры.Записывать = Истина;
    Движения.ОстаткиНоменклатуры.Записать();
    // Блокировка данных
    Блокировка = Новый БлокировкаДанных;
    ЭлементБлокировки = Блокировка.Добавить(&quot;РегистрНакопления.
    ОстаткиНоменклатуры&quot;);
    ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
    ЭлементБлокировки.ИсточникДанных = СписокНоменклатуры;
    ЭлементБлокировки.ИспользоватьИзИсточникаДанных(&quot;Номенклатура&quot;, 
    &quot;Номенклатура&quot;);

    Блокировка.Заблокировать();

    // Чтение партий, доступных для списания. Сортировка согласно метода 
    списания себестоимости
    Запрос = Новый Запрос;
    Запрос.Текст =
    &quot;ВЫБРАТЬ
    |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
    |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры КАК 
    ВидНоменклатуры,
    |   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Количество) КАК Количество,
    |   СУММА(РасходнаяНакладнаяСписокНоменклатуры.Сумма) КАК Сумма
    |ПОМЕСТИТЬ РасходнаяНакладная
    |ИЗ
    |   Документ.РасходнаяНакладная.СписокНоменклатуры КАК 
    РасходнаяНакладнаяСписокНоменклатуры
    |ГДЕ
    |   РасходнаяНакладнаяСписокНоменклатуры.Ссылка = &amp;Ссылка
    |
    |СГРУППИРОВАТЬ ПО
    |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура,
    |   РасходнаяНакладнаяСписокНоменклатуры.Номенклатура.ВидНоменклатуры
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   РасходнаяНакладная.Номенклатура КАК Номенклатура,
    |   ВЫБОР КОГДА РасходнаяНакладная.ВидНоменклатуры = 
    Значение(Перечисление.ВидНоменклатуры.Услуга) ТОГДА Истина ИНАЧЕ 
    Ложь КОНЕЦ КАК ЭтоУслуга,
    |   РасходнаяНакладная.Количество КАК Количество,
    |   РасходнаяНакладная.Сумма,
    |   ОстаткиНоменклатурыОстатки.Партия КАК Партия,
    |   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0) 
    КАК КоличествоОстаток,
    |   ЕСТЬNULL(ОстаткиНоменклатурыОстатки.СтоимостьОстаток, 0) КАК СтоимостьОстаток
    |ИЗ
    |   РасходнаяНакладная КАК РасходнаяНакладная
    |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
    |               &amp;МоментВремени,
    |               Номенклатура В
    |                   (ВЫБРАТЬ
    |                       РасходнаяНакладная.Номенклатура
    |                   ИЗ
    |                       РасходнаяНакладная)) КАК ОстаткиНоменклатурыОстатки
    |       ПО РасходнаяНакладная.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
    |
    |УПОРЯДОЧИТЬ ПО
    |   ОстаткиНоменклатурыОстатки.Партия.МоментВремени&quot; + СортировкаПартий + &quot;
    |ИТОГИ
    |   МАКСИМУМ(Услуга),
    |   МАКСИМУМ(Количество),
    |   МАКСИМУМ(Сумма),
    |   СУММА(КоличествоОстаток)
    |ПО
    |   Номенклатура&quot;;

    Запрос.УстановитьПараметр(&quot;Ссылка&quot;, Ссылка);
    Запрос.УстановитьПараметр(&quot;МоментВремени&quot;, МоментВремени());

    Результат = Запрос.Выполнить();
    ВыборкаНоменклатура = 
    Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);

    Пока ВыборкаНоменклатура.Следующий() Цикл

        // Контроль остатков
        Если (НЕ ВыборкаНоменклатура.Услуга) 
              И (ВыборкаНоменклатура.Количество &gt; 
              ВыборкаНоменклатура.КоличествоОстаток) Тогда
              
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = &quot;Не хватает &quot;+ 
            (ВыборкаНоменклатура.Количество - 
            ВыборкаНоменклатура.КоличествоОстаток) +
            &quot; позиций номенклатуры &quot; + ВыборкаНоменклатура.Номенклатура + 
            &quot;.&quot;;
            Сообщение.Сообщить();

            Отказ = Истина;
        КонецЕсли;

        Если Отказ Тогда
            Продолжить;
        КонецЕсли;

        // Создание движений
        ТекСебестоимость = 0;

        Если не ВыборкаНоменклатура.ЭтоУслуга Тогда

            ОсталосьСписать = ВыборкаНоменклатура.Количество;
            ВыборкаДетальныеЗаписи = ВыборкаНоменклатура.Выбрать();

            Пока (ОсталосьСписать &gt; 0) И 
            ВыборкаДетальныеЗаписи.Следующий() Цикл
                Списываем = Мин(ОсталосьСписать,  
                ВыборкаДетальныеЗаписи.КоличествоОстаток);

                // регистр ОстаткиНоменклатуры Расход
                Движение = Движения.ОстаткиНоменклатуры.Добавить();
                Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
                Движение.Период = Дата;
                Движение.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
                Движение.Партия = ВыборкаДетальныеЗаписи.Партия;
                Движение.Количество = Списываем;
                Движение.Стоимость = (Списываем * 
                ВыборкаДетальныеЗаписи.СтоимостьОстаток) /
                ВыборкаДетальныеЗаписи.КоличествоОстаток;

                ТекСебестоимость = ТекСебестоимость + Движение.Стоимость;
                ОсталосьСписать = ОсталосьСписать - Списываем;
            КонецЦикла;
        КонецЕсли;

        // регистр Продажи
        Движение = Движения.Продажи.Добавить();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаНоменклатура.Номенклатура;
        Движение.Количество = ВыборкаНоменклатура.Количество;
        Движение.Себестоимость = ТекСебестоимость;
        Движение.Выручка = ВыборкаНоменклатура.Сумма;
    КонецЦикла;

КонецПроцедуры</pre>
  <p id="sqC0">Займемся отчетами… Создадим отчет <strong>Продажи</strong>, добавим его в подсистему <strong>Оперативный учет</strong>, а затем на вкладке «Основные» нажмем кнопку «Открыть схему компоновки данных». В схему добавим набор данных вида «Запрос». Текст запроса легко можно создать визуальными средствами, но мы просто укажем его следующим образом:</p>
  <pre id="cFOv" data-lang="sql">ВЫБРАТЬ
	ПродажиОбороты.Номенклатура,
	ПродажиОбороты.КоличествоОборот КАК Количество,
	ПродажиОбороты.СебестоимостьОборот КАК Себестоимость,
	ПродажиОбороты.ВыручкаОборот КАК Продажа,
	ПродажиОбороты.ВыручкаОборот - ПродажиОбороты.СебестоимостьОборот 
	КАК Прибыль
ИЗ
	РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты</pre>
  <p id="cVad">Перейдем на закладку «Параметры». Установим параметры отчета согласно рисунка.</p>
  <figure id="OSDt" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/02/ad/02ad2249-5f2e-43a4-8068-3a2cda09d93e.png" width="1090" />
    <figcaption>Закладка &quot;Параметры&quot; отчета по продажам</figcaption>
  </figure>
  <p id="XLfO">Перейдем на закладку «Настройки». Добавим в структуру нашего отчета новую группировку (клавиша Ins), но поле группировки указывать не будем (клавиша Enter). На вкладке «Выбранные поля» укажем список полей отчета, согласно требуемой формы.</p>
  <figure id="Uvr3" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/1f/38/1f38ecdb-c813-4819-9531-48cebe1650b7.png" width="986" />
    <figcaption>Выбранные поля отчета по Продажам</figcaption>
  </figure>
  <p id="Zmhd">Рядом с вкладкой «Выбранные поля» расположена вкладка «Параметры». Перейдем на нее и выполним настройку параметра «Период» отчета.</p>
  <figure id="fl1p" class="m_original" data-caption-align="center">
    <img src="https://img3.teletype.in/files/26/8b/268bd04c-e101-4070-9e2e-c94a28d884d7.png" width="990" />
    <figcaption>Настройка параметров отчета по продажам</figcaption>
  </figure>
  <p id="Df9G">Последний штрих - переходим на вкладку «Другие настройки». Здесь зададим заголовок отчета.</p>
  <figure id="qiE9" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/5a/b5/5ab53306-12e0-4f2b-9013-85120d69b982.png" width="985" />
    <figcaption>Настройка заголовка отчета</figcaption>
  </figure>
  <p id="Knzu">Создадим отчет <strong>ОстаткиТоваров</strong>, добавим его в подсистему <strong>Оперативный учет</strong>, а затем на вкладке «Основные» нажмем кнопку «Открыть схему компоновки данных». В схему добавим набор данных вида «Запрос». Укажем следующий текст запроса:</p>
  <pre id="mnnL" data-lang="sql">ВЫБРАТЬ
	ОстаткиНоменклатурыОстатки.Номенклатура,
	ОстаткиНоменклатурыОстатки.Партия,
	ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Количество,
	ОстаткиНоменклатурыОстатки.СтоимостьОстаток КАК Стоимость
ИЗ
	РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК 
	ОстаткиНоменклатурыОстатки</pre>
  <p id="svUl">Перейдем на закладку «Ресурсы». Создадим ресурсы согласно рисунка, они нам необходимы потому, что в данном отчете присутствует группировка.</p>
  <figure id="xTdL" class="m_original" data-caption-align="center">
    <img src="https://img2.teletype.in/files/1a/2f/1a2fd3bf-f540-4d33-a947-d4fe09ebea6c.png" width="1090" />
    <figcaption>Закладка &quot;Ресурсы&quot; отчета по остаткам номенклатуры</figcaption>
  </figure>
  <p id="yUY9">Перейдем на закладку «Параметры». Установим заголовок и состав даты параметра «Период».</p>
  <figure id="KMbR" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/4c/9e/4c9ebcad-82fd-47c8-965e-f4ed06463364.png" width="1090" />
    <figcaption>Закладка &quot;Параметры&quot; отчета по остаткам</figcaption>
  </figure>
  <p id="UNpZ">Перейдем на закладку «Настройки». Добавим в структуру нашего отчета новую группировку (клавиша Ins), поле группировки - Номенклатура. Затем создадим вложенную в нее группировку, но для нее группировочное поле указывать не будем. На вкладке «Выбранные поля» укажем список полей отчета.</p>
  <figure id="hT6E" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/fe/a9/fea90e05-2f0d-4ddc-ba81-4a6e55de103e.png" width="1090" />
    <figcaption>Закладка &quot;Выбранные поля&quot; отчета по остаткам</figcaption>
  </figure>
  <p id="dEJI">Рядом с вкладкой «Выбранные поля» расположена вкладка «Параметры». Перейдем на нее и выполним настройку параметра «Дата» отчета.</p>
  <figure id="KxpM" class="m_original" data-caption-align="center">
    <img src="https://img1.teletype.in/files/82/c1/82c1ba02-3a9d-49ff-9d9e-cff75f9ccb72.png" width="1090" />
    <figcaption>Настройка параметров отчета по остаткам</figcaption>
  </figure>
  <p id="B0PE">И последнее - переходим на вкладку «Другие настройки». Здесь зададим заголовок отчета, а также укажем прочие параметры, необходимые для формирования отчета в требуемом виде.</p>
  <figure id="3q0K" class="m_original" data-caption-align="center">
    <img src="https://img4.teletype.in/files/b7/ec/b7ecd331-61e1-47e5-87a9-41a4b40ad0e9.png" width="1090" />
    <figcaption>Настройка параметров отчета по остаткам</figcaption>
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dc-zp/Kn5pmNQgc1g</guid><link>https://teletype.in/@dc-zp/Kn5pmNQgc1g?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/Kn5pmNQgc1g?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>На память 1С Спец</title><pubDate>Tue, 13 Jan 2026 20:01:32 GMT</pubDate><media:content medium="image" url="https://img1.teletype.in/files/0a/6d/0a6df5b6-c066-4a73-a8e0-b3099c8475a9.png"></media:content><description><![CDATA[<img src="https://img2.teletype.in/files/95/5f/955fb10b-60a9-46b8-a50b-1d279dc8f631.png"></img>11) Привязка сообщения к элементу форму:
Прикрепление сообщения о нехватке товара при списании к столбцу Количество ТЧ Товары. Рекомендуется делать во всех случаях для доведения приема до автоматизма(одна из задач на УФ):]]></description><content:encoded><![CDATA[
  <figure id="7VVV" class="m_original">
    <img src="https://img2.teletype.in/files/95/5f/955fb10b-60a9-46b8-a50b-1d279dc8f631.png" width="762" />
  </figure>
  <p id="aDnd"><a href="true">11) Привязка сообщения к элементу форму:</a><br />Прикрепление сообщения о нехватке товара при списании к столбцу Количество ТЧ Товары. Рекомендуется делать во всех случаях для доведения приема до автоматизма(одна из задач на УФ):</p>
  <pre id="1qIW">Сообщение. Текст = &quot; Не хватает&quot; + Выборка.Представление + &quot; в количестве &quot; + Число(Выборка.Количество - Выборка.КоличествоОстаток) ;
Сообщение. Поле = &quot;Товары[&quot; + (Выборка.НомерСтроки -1) + &quot;].Количество&quot;;
Сообщение.УстановитьДанные(ЭтотОбъект);</pre>
  <p id="lXO5"></p>
  <p id="PRno">*В модуле объекта обработки ЗаполнениеГрафика*</p>
  <pre id="LeyN">Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни) Экспорт 

	Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
	Набор.Отбор.Подразделение.Установить(Подразделение);
	
	ЧислоСекундВСутках = 86400;
	Дат = ДатаНачала;
	
	Пока Дат &lt;= ДатаОкончания Цикл
		Запись = Набор.Добавить();
		Запись.Дата = Дат;
		Запись.Подразделение = Подразделение;
		Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
			Запись.КоличествоЧасов = 0;
		Иначе	          
			Запись.КоличествоЧасов = 8;
		КонецЕсли; 
		Дат = Дат + ЧислоСекундВСутках;
	КонецЦикла; 
	Набор.Записать();
	
КонецПроцедуры</pre>
  <p id="oT2f"></p>
  <p id="xD9X">*В модуле объекта обработки ЗаполнениеГрафика при Сверхурочных часах*</p>
  <pre id="kKD5">Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни, ОтражатьСверхурочные) Экспорт 
	
	Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
	Набор.Отбор.Подразделение.Установить(Подразделение);
	
	Набор.Прочитать();
	
	ЧислоСекундВСутках = 86400;
	
	Дат = ДатаНачала;
		
	Пока Дат &lt;= ДатаОкончания Цикл
		Запись = Набор.Добавить();
		Запись.Дата = Дат;
		Запись.Подразделение = Подразделение;
		ДеньНедели = ДеньНедели(Дат);
		Если Найти(ВыходныеДни, Строка(ДеньНедели)) Тогда
			Запись.РабочихЧасов = 0;
		Иначе	          
			Запись.РабочихЧасов = 8;
		КонецЕсли; 
		
		Если ОтражатьСверхурочные И (ДеньНедели =2 ИЛИ ДеньНедели = 4) Тогда
			Запись.СверхурочныхЧасов = 3;
		КонецЕсли;
		
		Дат = Дат + ЧислоСекундВСутках;
	КонецЦикла; 
	Набор.Записать();
КонецПроцедуры</pre>
  <p id="wd8a"></p>
  <p id="7YSh">*В модуле объекта обработки ЗаполнениеГрафика при смене 1 через 3*</p>
  <pre id="Yjbg">Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни) Экспорт 
	
	Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
	Набор.Отбор.График.Установить(График);
	Набор.Прочитать();
	
	ЧислоСекундВСутках = 8640Текуща
	
	ТекущаяДата = ДатаНачала;
	Пока ТекущаяДата &lt;= ДатаОкончания Цикл
		Запись = Набор.Добавить();
		Запись.Дата = ТекущаяДата;
		Запись.График = График;
		Запись.КоличествоЧасов = 24;
		ТекущаяДата = ТекущаяДата + 3 * 86400;
	КонецЦикла; 
	Набор.Записать();
КонецПроцедуры
</pre>
  <p id="gRH4">*В модуле объекта обработки ЗаполнениеГрафика при обмене Автомобилми и дополнительному графику по пятидневки для расчета отпуска*</p>
  <pre id="EtLG">Процедура ЗаполнитьГрафик(ДатаНачала, ДатаОкончания, ВыходныеДни) Экспорт 
	Набор = РегистрыСведений.ГрафикиРаботы.СоздатьНаборЗаписей();
	Набор.Отбор.Автомобиль.Установить(Автомобиль);
	ЧислоСекундВСутках = 86400;
	Дат = ДатаНачала;
	
	Пока Дат &lt;= ДатаОкончания Цикл
		Запись = Набор.Добавить();
		Запись.Дата = Дат;
		Запись.Автомобиль = Автомобиль;
		Если Найти(ВыходныеДни, Строка(ДеньНедели(Дат))) Тогда
			Запись.РабочихДней = 0;
		Иначе	          
			Запись.РабочихДней = 1;
		КонецЕсли; 
		
		Если ДеньНедели(Дат) &lt; 6 Тогда
			Запись.ДнейПятидневки = 1;
		Иначе	
			Запись.ДнейПятидневки = 0;
		КонецЕсли;
		
		Дат = Дат + ЧислоСекундВСутках;
	КонецЦикла; 
	Набор.Записать();

	КонецПроцедуры</pre>
  <figure id="OYSC" class="m_original">
    <img src="https://img3.teletype.in/files/ac/23/ac232685-df19-43b3-85c6-43ac63695a92.png" width="651" />
  </figure>
  <figure id="FZlY" class="m_column">
    <img src="https://img4.teletype.in/files/fc/63/fc632591-665e-4fd2-a756-5b1fe2bc14af.png" width="881" />
  </figure>
  <figure id="XRdU" class="m_column">
    <img src="https://img2.teletype.in/files/99/6e/996ee461-4b63-4855-80e6-608cc3b13a9f.png" width="747" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dc-zp/OLfvvktVTGR</guid><link>https://teletype.in/@dc-zp/OLfvvktVTGR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/OLfvvktVTGR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>Activating plugin 1C:Enterprise.Element Script failed: not found: java.exe</title><pubDate>Sat, 20 Sep 2025 19:03:54 GMT</pubDate><media:content medium="image" url="https://img3.teletype.in/files/2a/54/2a547e3b-f18f-45ad-bfd9-933b594d9782.png"></media:content><category>1СЭлементСкрипт</category><description><![CDATA[<img src="https://img2.teletype.in/files/53/bd/53bdb051-4552-4a63-9cf9-90eaeb8dae7e.png"></img>Установили 1С Предприятие Элемент Скрипт. При попытке выполнить тестовый скрипт &quot;Привет, Мир!&quot;, программа пишет об ошибке - Activating plugin '1C:Enterprise.Element Script' failed: not found: java.exe.]]></description><content:encoded><![CDATA[
  <p id="rFHA">Установили 1С Предприятие Элемент Скрипт. При попытке выполнить тестовый скрипт &quot;Привет, Мир!&quot;, программа пишет об ошибке - Activating plugin &#x27;1C:Enterprise.Element Script&#x27; failed: not found: java.exe.</p>
  <figure id="Wkpf" class="m_original">
    <img src="https://img2.teletype.in/files/53/bd/53bdb051-4552-4a63-9cf9-90eaeb8dae7e.png" width="974" />
  </figure>
  <figure id="q3XV" class="m_original">
    <img src="https://img1.teletype.in/files/0e/6d/0e6d0b3f-7a05-4018-9d9a-624346e2137e.png" width="974" />
  </figure>
  <p id="0TYd">Для устранения ошибки нужно прописать установленный JAVA в переменные среды.</p>
  <p id="9qeP">Проверить установлена ли JAVA можно в каталоге &quot;C:\Program Files\1C\1CE\components&quot;</p>
  <figure id="V9bM" class="m_original">
    <img src="https://img4.teletype.in/files/b4/92/b4928d09-2a3a-4707-8c3c-4566a2da8314.png" width="1118" />
  </figure>
  <p id="2Ush">Для доступа к переменным среды нужно перейти в Windows 11: Параметры - О системе - Дополнительные параметры системы.</p>
  <figure id="Zz6A" class="m_original">
    <img src="https://img3.teletype.in/files/e0/c1/e0c18a48-d8f4-4aa1-8b2d-1510ab46d9e7.png" width="866" />
  </figure>
  <p id="yGG7">В переменные среды жмем кнопку &quot;Создать&quot; и создаем новый параметр &quot;JAVA_HOME&quot; с указанием значения каталога, где установлена JAVA &quot;C:\Program Files\1C\1CE\components\axiom-jdk-full-17.0.16+12-x86_64&quot;.</p>
  <figure id="pen5" class="m_original">
    <img src="https://img3.teletype.in/files/a8/28/a82838ee-158a-44a7-a16c-ba1c26346d9b.png" width="916" />
  </figure>
  <p id="8Qri">В системных переменных ищем переменную PATH, открываем найденную переменную. После того как откроется окно изменения переменной среды, создаем еще один параметр и прописываем пусть к JAVA &quot;C:\Program Files\1C\1CE\components\axiom-jdk-full-17.0.16+12-x86_64&quot;.</p>
  <figure id="wux0" class="m_original">
    <img src="https://img2.teletype.in/files/14/4b/144b603c-187b-43b0-821c-c7f1ffdc2d77.png" width="747" />
  </figure>
  <p id="TH3t">После того как добавили переменную окружения и переменную среды перезапускаем 1С Предприятие Элемент Скрипт и пробуем выполнить скрипт. Возможно при первом выполнении скрипта появится окно Разрешения на запуск приложения JAVA, жмем Разрешить.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dc-zp/MapfYacOTjs</guid><link>https://teletype.in/@dc-zp/MapfYacOTjs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/MapfYacOTjs?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>1С HTTP</title><pubDate>Fri, 17 Jan 2025 07:51:31 GMT</pubDate><media:content medium="image" url="https://img2.teletype.in/files/d3/4c/d34c0b02-a004-4b3d-a773-e2586c43c537.png"></media:content><description><![CDATA[<img src="https://img4.teletype.in/files/3f/fa/3ffaeedc-2b9b-4cf5-8300-dd4cd1c69005.png"></img>]]></description><content:encoded><![CDATA[
  <figure id="Af01" class="m_original">
    <img src="https://img4.teletype.in/files/3f/fa/3ffaeedc-2b9b-4cf5-8300-dd4cd1c69005.png" width="1600" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dc-zp/gfs5aa6lbDR</guid><link>https://teletype.in/@dc-zp/gfs5aa6lbDR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/gfs5aa6lbDR?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>Всякие полезности</title><pubDate>Mon, 12 Aug 2024 19:16:39 GMT</pubDate><category>1C</category><description><![CDATA[Всякие полезности]]></description><content:encoded><![CDATA[
  <h2 id="8f9x">Текстовый файл</h2>
  <h3 id="VQie">Как выгрузить данные из справочника в текстовый файл?</h3>
  <pre id="YseN">Текст = Новый ТекстовыйДокумент; 
Выборка = Справочники.Номенклатура.Выбрать(); 
Пока Выборка.Следующий() Цикл 
Стр = СтрЗаменить(Выборка.Наименование, Символ(34), &quot;%квч%&quot;); 
Код = Строка(Выборка.Код) + Символ(34); 
Текст.ДобавитьСтроку(Код + Стр); 
КонецЦикла; 
Текст.Записать(&quot;c:\temp\text.txt&quot;);</pre>
  <h3 id="LwwK">Как загрузить данные из текстового файла?</h3>
  <pre id="pkJ1">Текст = Новый ТекстовыйДокумент; 
Текст.Прочитать(&quot;c:\temp\text.txt&quot;); 
Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл 
Стр = Текст.ПолучитьСтроку(НомерСтроки); 
Позиция = Найти(Стр, Символ(34)); 
Код = Сред(Стр, 1, Позиция-1); 
прНаименование = Сред(Стр, Позиция + 1); 
Наименование = СтрЗаменить(прНаименование, &quot;%квч%&quot;, Символ(34)); 
Сообщить(Код + &quot;-&quot; + Наименование); 
КонецЦикла;</pre>
  <h3 id="005R">Работа с текстом. Модель последовательного доступа</h3>
  <pre id="cVpv">Путь = &quot;c:\temp\text.txt&quot;; 
Текст = Новый ЗаписьТекста(Путь, КодировкаТекста.UTF8); 
Выборка = Справочники.Номенклатура.Выбрать(); 
Пока Выборка.Следующий() Цикл 
Текст.ЗаписатьСтроку(Выборка.Наименование); 
КонецЦикла; 
Текст.Закрыть();</pre>
  <pre id="jiEf">Путь = &quot;c:\temp\text.txt&quot;; 
Текст = Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8); 
Стр = Текст.ПрочитатьСтроку(); 
Пока Стр &lt;&gt; Неопределено Цикл 
Стр = Текст.ПрочитатьСтроку(); 
Сообщить(Стр); 
КонецЦикла;</pre>
  <h2 id="UxIq">XML</h2>
  <h3 id="7f7U">Как из одной базы перенести документ в другую базу?</h3>
  <pre id="qNFc">// Выгрузить в файл xml. 
ЗаписьXML=Новый ЗаписьXML(); 
ЗаписьXML.ОткрытьФайл(&quot;c:\doc.xml&quot;); 
ЗаписьXML.ЗаписатьНачалоЭлемента(&quot;Root&quot;); 
// Получить объект по ссылке. 
ВыгружаемыйОбъект=Документ.ПолучитьОбъект(); 
// С помощью средств сериализации записать объект в файл. 
ЗаписатьXML(ЗаписьXML,ВыгружаемыйОбъект); 
ЗаписьXML.ЗаписатьКонецЭлемента(); 
ЗаписьXML.Закрыть();</pre>
  <pre id="kkIA">ЧтениеXML=Новый ЧтениеXML(); 
ЧтениеXML.ОткрытьФайл(&quot;c:\doc.xml&quot;); 
// Текущим становится элемент Root. 
ЧтениеXML.Прочитать(); 
// Текущим становится элемент с документом. 
ЧтениеXML.Прочитать(); 
// Проверить сможет ли с данным значением &quot;справиться&quot; 
// система сериализации в данной базе. 
Если ВозможностьЧтенияXML(ЧтениеXML) Тогда 
// Получить ДокументОбъект.РеализацияТоваровУслуг 
ЗагружаемыйОбъект=ПрочитатьXML(ЧтениеXML); 
ЗагружаемыйОбъект.Записать(); 
КонецЕсли; 
ЧтениеXML.Закрыть();</pre>
  <h3 id="hICO">Как можно сформировать XML-документ произвольной структуры?</h3>
  <pre id="BllK">Запись = Новый ЗаписьXML; 
Запись.ОткрытьФайл(ПутьКФайлу); 
Запись.ЗаписатьОбъявлениеXML(); 
Запись.ЗаписатьНачалоЭлемента(&quot;Корневой&quot;); 
Запись.ЗаписатьАтрибут(&quot;Справочник&quot;, &quot;Номенклатура&quot;); 
Запись.ЗаписатьКомментарий(&quot;Краткая информация о номенклатуре&quot;); 
Выборка = Справочники.Номенклатура.ВыбратьИерархически(); 
Пока Выборка.Следующий() Цикл 
Если Выборка.ЭтоГруппа Тогда 
Продолжить; 
КонецЕсли; 
Запись.ЗаписатьНачалоЭлемента(&quot;Элемент&quot;); 
Запись.ЗаписатьАтрибут(&quot;Код&quot;, Строка(Выборка.Код)); 
Запись.ЗаписатьАтрибут(&quot;Артикул&quot;, Строка(Выборка.Артикул)); 
Запись.ЗаписатьТекст(Выборка.Наименование); 
Запись.ЗаписатьКонецЭлемента(); 
КонецЦикла; 
Запись.ЗаписатьКонецЭлемента(); 
Запись.Закрыть();</pre>
  <h3 id="A7Gr">Как сформировать XML-документ в строку?</h3>
  <pre id="2A2c">Запись = Новый ЗаписьXML(); 
Запись.УстановитьСтроку(); 
Запись.ЗаписатьОбъявлениеXML(); 
Запись.ЗаписатьНачалоЭлемента(&quot;Корневой&quot;); 
Запись.ЗаписатьАтрибут(&quot;Справочник&quot;, &quot;Номенклатура&quot;); 
Запись.ЗаписатьКомментарий(&quot;Краткая информация о номенклатуре&quot;); 
Выборка = Справочники.Номенклатура.ВыбратьИерархически(); 
Пока Выборка.Следующий() Цикл 
Если Выборка.ЭтоГруппа Тогда 
Продолжить; 
КонецЕсли; 
Запись.ЗаписатьНачалоЭлемента(&quot;Элемент&quot;); 
Запись.ЗаписатьАтрибут(&quot;Код&quot;, Строка(Выборка.Код)); 
Запись.ЗаписатьАтрибут(&quot;Артикул&quot;, Строка(Выборка.Артикул)); 
Запись.ЗаписатьТекст(Выборка.Наименование); 
Запись.ЗаписатьКонецЭлемента(); 
КонецЦикла; 
Запись.ЗаписатьКонецЭлемента(); 
Стр = Запись.Закрыть(); 
Сообщить(Стр);</pre>
  <h3 id="heG9">Как можно обмениваться данными, используя XML-сериализацию через файлы других форматов?</h3>
  <pre id="KLmQ">ЗаписьXML = Новый ЗаписьXML(); 
ЗаписьXML.УстановитьСтроку(); 
Данные = СсылкаНаДокумент.ПолучитьОбъект(); 
ЗаписатьXML(ЗаписьXML, Данные); 
ТекстСообщения = ЗаписьXML.Закрыть(); 
Текст = Новый ТекстовыйДокумент; 
Текст.УстановитьТекст(ТекстСообщения); 
Текст.Записать(ПутьКФайлу);</pre>
  <pre id="U6hs">Текст = Новый ТекстовыйДокумент; 
Текст.Прочитать(ПутьКФайлу); 
ЧтениеXML = Новый ЧтениеXML(); 
ЧтениеXML.УстановитьСтроку(Текст.ПолучитьТекст()); 
Если ВозможностьЧтенияXML(ЧтениеXML) Тогда 
Данные = ПрочитатьXML(ЧтениеXML); 
Данные.Записать(); 
КонецЕсли;</pre>
  <h3 id="5x0e">Как можно загрузить XML документ произвольной структуры?</h3>
  <pre id="w8jO">Чтение = Новый ЧтениеXML; 
Чтение.ОткрытьФайл(ПутьКФайлу); 
Пока Чтение.Прочитать() Цикл 
// Прочитать &quot;структурные части&quot; элементов. 
// Проверить, какая часть элемента - текущая. 
Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда 
ИмяУзла = Чтение.Имя; 
Сообщить(&quot;--&quot; + ИмяУзла); 
// Атрибуты элементов можно читать только если текущая часть - 
// начало элемента 
Пока Чтение.ПрочитатьАтрибут() Цикл 
// Прочитать данные узла атрибута. 
ТипУзла = Чтение.ТипУзла; 
Имя = Чтение.Имя; 
Значение = Чтение.Значение; 
// Обработать полученные значения. 
КонецЦикла; 
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда 
// В примере просто выводим текст в окно сообщений. 
Сообщить(&quot;Текст:&quot; + Чтение.Значение); 
ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда 
// В примере просто выводим признак конца элемента 
// в окно сообщений 
Сообщить(&quot;--Конец:&quot; + Чтение.Имя); 
КонецЕсли; 
КонецЦикла;</pre>
  <h2 id="R3NH">DBF-файлы</h2>
  <h3 id="PbIn">Как можно построить выгрузку-загрузку посредством файлов DBF?</h3>
  <pre id="5xm9">БД = Новый XBase; 
БД.Поля.Добавить(&quot;CODE&quot;, &quot;S&quot;, 5); 
БД.Поля.Добавить(&quot;NAME&quot;, &quot;S&quot;, 40); 
БД.СоздатьФайл(Путь + &quot;start.dbf&quot;, Путь + &quot;index.cdx&quot;); 
БД.Индексы.Добавить(&quot;IDXCODE&quot;, &quot;CODE&quot;); 
ФлИБД = БД.СоздатьИндексныйФайл(Путь + &quot;index.cdx&quot;); 
БД.АвтоСохранение = Истина; 
Выборка = Справочники.Номенклатура.ВыбратьИерархически(); 
Пока Выборка.Следующий() Цикл 
БД.Добавить(); 
БД.CODE = Выборка.Код; 
БД.NAME = Выборка.Наименование; 
КонецЦикла; 
БД.ЗакрытьФайл();</pre>
  <pre id="Oqt7">БД = Новый XBase; 
БД.ОткрытьФайл(Путь + &quot;start.dbf&quot;, Путь + &quot;index.cdx&quot;); 
БД.ТекущийИндекс = БД.Индексы.IDXCODE; 
Пока БД.Следующая() Цикл 
Сообщить(БД.CODE); 
Сообщить(БД.NAME); 
КонецЦикла; 
БД.ЗакрытьФайл();</pre>
  <h2 id="JNho">Работа с HTML-документами</h2>
  <h3 id="zT0W">Заполнение HTML-анкет</h3>
  <figure id="gEdi" class="m_original">
    <img src="https://img4.teletype.in/files/be/28/be2876e3-1af9-4bb9-b4b5-cec6a04df633.png" width="364" />
  </figure>
  <pre id="KYkn">Процедура URLПриИзменении(Элемент) 
ЭлементыФормы.ПолеHTML.Перейти(URL); 
КонецПроцедуры</pre>
  <pre id="CIXV">Процедура ПолеHTMLДокументСформирован(Элемент) 
// Событие возникает и при открытии формы, когда в реквизите 
// URL содержится пустая строка. 
Если URL &lt;&gt; &quot;&quot; Тогда 
Док = ЭлементыФормы.ПолеHTML.Документ; 
// При попытке обратиться к несуществующему свойству 
// произойдет ошибка 
Док.forms[&quot;frm&quot;].fam.Value = &quot;Иванов&quot;; 
Док.forms[&quot;frm&quot;].nam.Value = &quot;Иван&quot;; 
Док.forms[&quot;frm&quot;].otch.Value = &quot;Иванович&quot;; 
КонецЕсли; 
КонецПроцедуры</pre>
  <h2 id="mBrI">Работа с файлами</h2>
  <h3 id="gPK0">Как организовать диалог выбора текстового файла?</h3>
  <pre id="oPaM">Режим = РежимДиалогаВыбораФайла.Открытие; 
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); 
ДиалогОткрытияФайла.ПолноеИмяФайла = &quot;&quot;; 
Фильтр = &quot;Текст(*,txt)|*.txt&quot;; 
ДиалогОткрытияФайла.Фильтр = Фильтр; 
ДиалогОткрытияФайла.МножественныйВыбор = Ложь; 
ДиалогОткрытияФайла.Заголовок = &quot;Выберите файл&quot;; 
Если ДиалогОткрытияФайла.Выбрать() Тогда 
ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла; 
КонецЕсли;</pre>
  <pre id="bYuW">Режим = РежимДиалогаВыбораФайла.ВыборКаталога; 
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим); 
ДиалогОткрытия.Каталог = &quot;&quot;; 
ДиалогОткрытия.МножественныйВыбор = Ложь; 
ДиалогОткрытия.Заголовок = &quot;Выберите каталог&quot;; 
Если ДиалогОткрытия.Выбрать() Тогда 
ПутьККаталогу = ДиалогОткрытия.Каталог; 
КонецЕсли;</pre>
  <h3 id="Aox6">Как прочитать информацию о файле?</h3>
  <pre id="9v77">ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); 
ДиалогОткрытияФайла.Выбрать(); 
Файл = Новый Файл(ДиалогОткрытияФайла.ПолноеИмяФайла); 
Текст = &quot;Файл: &quot; + Файл.Имя; 
Текст = Текст + Символы.ПС + &quot;Расширение: &quot; + Файл.Расширение; 
Текст = Текст + Символы.ПС + &quot;Полное имя: &quot; + Файл.ПолноеИмя; 
Текст = Текст + Символы.ПС + &quot;Путь: &quot; + Файл.Путь; 
Текст = Текст + Символы.ПС + &quot;Размер: &quot; + Файл.Размер() + &quot; байт&quot;; 
Текст = Текст + ?(Файл.ПолучитьНевидимость(), Символы.ПС + &quot;Невидимый. &quot;, &quot;&quot;); 
Текст = Текст + ?(Файл.ПолучитьТолькоЧтение(), Символы.ПС + &quot;Только чтение.&quot;, &quot;&quot;); 
Текст = Текст + Символы.ПС + &quot;Последнее изменение: &quot; + Файл.ПолучитьВремяИзменения(); 
Сообщить(Текст);</pre>
  <h3 id="SgaI">Как получить список файлов в указанном каталоге?</h3>
  <pre id="REhi">МассивНайденных = НайтиФайлы(&quot;C:\Обмен\Входящие&quot;, &quot;*.xml&quot;); 
Для Каждого Файл из МассивНайденных Цикл 
Сообщить(Файл.Имя); 
// Обработать найденные файлы. 
КонецЦикла;</pre>
  <h3 id="clLn">Как переместить файл, выложенный на ftp к себе на локальный компьютер?</h3>
  <pre id="6K5Q">Если НайтиФайлы(&quot;C:\Temp\Sklad.xml&quot;) &lt;&gt; Неопределено Тогда 
УдалитьФайлы(&quot;C:\Temp\ Sklad.xml &quot;); 
КонецЕсли; 
Если НайтиФайлы(&quot;ftp://111.222.333.4/Sklad.xml&quot;) &lt;&gt; Неопределено Тогда 
ПереместитьФайл(&quot;ftp://111.222.333.4/Sklad.xml&quot;, &quot;C:\Temp\ Sklad.xml&quot;); 
Сообщить(&quot;Файл перемещен.&quot;); 
Иначе 
Сообщить(&quot;Действие не выполнено. Файл в источнике не найден.&quot;); 
КонецЕсли;</pre>
  <h3 id="W8Ij">Как разделить большой файл на несколько файлов определенного размера?</h3>
  <pre id="RYDe">РазделитьФайл(&quot;D:/1/MyFile.xml&quot;, 1024*1024, &quot;D:/1/11/&quot;);
ОбъединитьФайлы(&quot;D:/1/11/MyFile.xml.*&quot;, &quot;D:/1/11/MyProg.exe&quot;);</pre>
  <h3 id="v8JI">Как поместить файлы в архив?</h3>
  <pre id="cgMs">ФайлАрхива = Новый ЗаписьZipФайла(&quot;C:\Arch.zip&quot;, , , МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный); 
ФайлАрхива.Добавить(&quot;C:\Inetpub\wwwroot\Applic1\*.*&quot;, РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно); 
ФайлАрхива.Записать();</pre>
  <pre id="kZoP">ФайлАрхива = Новый ЧтениеZIPФайла(&quot;C:\Arch.zip&quot;); 
ФайлАрхива.ИзвлечьВсе(&quot;C:\Open&quot;, РежимВосстановленияПутейФайловZIP.Восстанавливать); 
ФайлАрхива.Закрыть();</pre>
  <h3 id="TOym">Как сравнить два текстовых файла?</h3>
  <pre id="KRaO">ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); 
ДиалогОткрытияФайла.Фильтр = &quot;Текстовый документ(*.txt)|*.txt&quot;; 
// Выбрать первый файл. 
ДиалогОткрытияФайла.Заголовок = &quot;Выберите первый файл:&quot;; 
ДиалогОткрытияФайла.Выбрать(); 
ИмяФайла1 = ДиалогОткрытияФайла.ПолноеИмяФайла; 
// Выбрать второй файл. 
ДиалогОткрытияФайла.Заголовок = &quot;Выберите второй файл:&quot;; 
ДиалогОткрытияФайла.Выбрать(); 
ИмяФайла2 = ДиалогОткрытияФайла.ПолноеИмяФайла; 
// Сравнить выбранные файлы. 
СравнениеФайлов = Новый СравнениеФайлов(); 
СравнениеФайлов.ПервыйФайл = ИмяФайла1; 
СравнениеФайлов.ВторойФайл = ИмяФайла2; 
СравнениеФайлов.ИгнорироватьПустоеПространство = Истина; 
СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.ТекстовыйДокумент; 
СравнениеФайлов.ПоказатьРазличия();</pre>
  <h3 id="JxvS">Как организовать контроль формирования файла внешним приложением?</h3>
  <pre id="Xn5n">Процедура ПроверкаНаличияФайла() 
ИмяКаталога = &quot;c:\temp&quot;; 
Маска = &quot;*.xml&quot;; 
НайденныеФайлы = НайтиФайлы(ИмяКаталога, Маска); 
Для Каждого Файл Из НайденныеФайлы Цикл 
Сообщить(Файл.Имя); 
КонецЦикла; 
КонецПроцедуры

ПодключитьОбработчикОжидания(&quot;ПроверкаНаличияФайла&quot;, 10);</pre>
  <h2 id="QVK9">ActiveX</h2>
  <h3 id="WiZy">Как использовать элементы управления ActiveX?</h3>
  <pre id="eOLS">Режим = РежимДиалогаВыбораФайла.Открытие; 
ДиалогФыбораФайла = Новый ДиалогВыбораФайла(Режим); 
ДиалогФыбораФайла.Фильтр = &quot;Все файлы (все)|*.*&quot;; 
ДиалогФыбораФайла.Заголовок = &quot;Выберите медиа файл&quot;; 
Если ДиалогФыбораФайла.Выбрать() Тогда 
ПутьКМедиаФайлу = ДиалогФыбораФайла.ПолноеИмяФайла; 
// В зависимости от варианта объекта запись полного пути к файлу 
// производится либо в свойство FileName, либо в свойство URL. 
Попытка ЭлементыФормы.WMP.FileName = ПутьКМедиаФайлу; 
Исключение ЭлементыФормы.WMP.URL = ПутьКМедиаФайлу; 
КонецПопытки; 
КонецЕсли;</pre>
  <h2 id="5I0i">Макеты ActiveDocument</h2>
  <h3 id="Gu60">Как сформировать новый договор на основании файла Microsoft Word?</h3>
  <pre id="9T5H">Договор = ПолучитьМакет(&quot;Договор&quot;); 
// Получить объект из макета. 
MSWord = Договор.Получить(); 
НаименованиеКонтрагента = &quot;ООО Торгуем всем&quot;; 
Попытка 
Документ = MSWord.Application.Documents(1); 
Документ.Activate(); 
// Получить объект, который будем использовать для поиска и замены. 
Замена = Документ.Content.Find; 
// Заменить заранее определенные ключевые конструкции на требуемый текст. 
Замена.Execute(&quot;&lt;НазваниеКомпании&gt;&quot;, Ложь, Истина, Ложь, , , Истина, , Ложь, НаименованиеКонтрагента); 
// Далее аналогично для остальных ключевых конструкций. 
// Делаем видимым приложение и активизируем его. 
MSWord.Application.Visible = Истина; 
MSWord.Activate(); 
Исключение 
// Если произойдет ошибка выводятся данные об ошибке и объект закрывается. 
Сообщить(ОписаниеОшибки()); 
MSWord.Application.Quit(); 
КонецПопытки;</pre>
  <h2 id="XWiq">Работа с Интернет</h2>
  <h3 id="LwAA">Работа с электронной почтой</h3>
  <h3 id="5GjT"><u>Как организовать работу с электронной почтой через установленного почтового клиента?</u></h3>
  <pre id="AIR8">Почта = Новый Почта; 
Почта.Подключиться(&quot;login&quot;, &quot;password&quot;); 
Сообщ = Новый ПочтовоеСообщение; 
Сообщ.Текст = &quot;Доброе время суток!!!!&quot;; 
Сообщ.Тема = &quot;Срочно в номер!!!&quot;; 
Данные = Новый ДвоичныеДанные(&quot;c:\attach.txt&quot;); 
Сообщ.Вложения.Добавить(Данные,&quot;attach.txt&quot;); 
Сообщ.Получатели.Добавить(&quot;hline@1c.ru&quot;); 
Почта.Послать(Сообщ, Ложь); 
Почта.Отключиться();</pre>
  <pre id="rAy3">Почта = Новый Почта; 
Почта.Подключиться(&quot;login&quot;, &quot;password&quot;); 
Выборка = Почта.Выбрать(Истина, Ложь); 
Для Каждого Сообщение Из Выборка Цикл 
Сообщить(&quot;Тема: &quot; + Строка(Сообщение.Тема)); 
Сообщить(&quot;Текст: &quot; + Строка(Сообщение.Текст)); 
Для Каждого Вложение Из Сообщение.Вложения Цикл 
Сообщить(Строка(Вложение.Наименование)); 
КонецЦикла; 
КонецЦикла;</pre>
  <h3 id="m5Ww"><u>Как организовать работу с почтой без установленного почтового клиента на компьютере пользователя?</u></h3>
  <pre id="qqYv">// Сформировать почтовый профиль. 
// При отправке нет необходимости указывать настройки, связанные с POP сервером. 
ИПП = Новый ИнтернетПочтовыйПрофиль; 
ИПП.АдресСервераSMTP = Константы.АдресСервераSMTP.Получить(); 
ИПП.ВремяОжидания = Константы.ВремяОжидания.Получить(); 
ИПП.Пароль = Константы.Пароль.Получить(); 
ИПП.ПарольSMTP = Константы.ПарольSMTP.Получить(); 
ИПП.Пользователь = Константы.Пользователь.Получить(); 
ИПП.ПользовательSMTP = Константы.ПользовательSMTP.Получить(); 
ИПП.ПортSMTP = Константы.ПортSMTP.Получить(); 
// Создать сообщение. 
Сообщение = Новый ИнтернетПочтовоеСообщение; 
Сообщение.Получатели.Добавить(&quot;hline@1c.ru&quot;); 
Сообщение.Отправитель.Адрес = &quot;booktest@yandexyandex.ru&quot;; 
Сообщение.Тема = &quot;Срочно в номер!&quot;; 
Сообщение.Тексты.Добавить(&quot;Доброе время суток!&quot;); 
Вложение = Новый ДвоичныеДанные(ПутьКФайлуВложения); 
Сообщение.Вложения.Добавить(Вложение,&quot;attach.txt&quot;); 
// Подключиться и отправить. 
Почта = Новый ИнтернетПочта; 
Почта.Подключиться(Профиль); 
Почта.Послать(Сообщение); 
Почта.Отключиться();</pre>
  <pre id="IFDS">// Формирование почтового профиля. 
// При получении нет необходимости указывать настройки, связанные с SMTP сервером. 
СостояниеПриема = &quot;Подключение к серверу&quot;; 
ИПП = Новый ИнтернетПочтовыйПрофиль; 
ИПП.АдресСервераPOP3 = Константы.АдресСервераPOP3.Получить(); 
ИПП.ВремяОжидания = Константы.ВремяОжидания.Получить(); 
ИПП.Пароль = Константы.Пароль.Получить(); 
ИПП.Пользователь = Константы.Пользователь.Получить(); 
ИПП.ПортPOP3 = Константы.ПортPOP3.Получить(); 
Соединение = Новый ИнтернетПочта; 
Соединение.Подключиться(ИПП); 
СостояниеПриема = &quot;Получение выборки писем&quot;; 
Выборка = Соединение.Выбрать(ЗабиратьССервера); 
СостояниеПриема = &quot;Создание документов - писем&quot;; 
КоличествоВВыборке = Выборка.Количество(); 
Индекс = 1; 
Для Каждого Письмо Из Выборка Цикл 
ТекПозиция = Окр(Индекс*100/КоличествоВВыборке); 
Если ТекПозиция &lt;&gt; Позиция Тогда 
Позиция = ТекПозиция; 
КонецЕсли; 
Док = Документы.Письмо.СоздатьДокумент(); 
Док.Тема = Письмо.Тема; 
СтрПолучатели = &quot;&quot;; 
Для Каждого Адрес Из Письмо.Получатели Цикл 
СтрПолучатели = СтрПолучатели + Адрес.Адрес + &quot;,&quot;; 
КонецЦикла; 
Док.Получатели = СтрПолучатели; 
Если ТипЗнч(Письмо.Отправитель) = Тип(&quot;Строка&quot;) Тогда 
Отправитель = Письмо.Отправитель; 
Иначе Отправитель = Письмо.Отправитель.Адрес; 
КонецЕсли; 
Док.Отправитель = Отправитель; 
Содержание = &quot;&quot;; 
Для Каждого ТекстСообщения Из Письмо.Тексты Цикл 
Содержание = Содержание + ТекстСообщения.Текст + Символы.ПС; 
КонецЦикла; 
Док.Содержание = Содержание; 
Индекс = Индекс + 1; 
Док.Записать(); 
КонецЦикла; 
Соединение.Отключиться();</pre>
  <h3 id="4T5s">Выполнение HTTP запроса</h3>
  <pre id="rm4H">СерверИсточник = HTTPserver; 
Адрес = &quot;/price.asp&quot;; 
ИмяВходящегоФайла = &quot;c:\temp\input.html&quot;; 
НТТР = Новый HTTPСоединение(СерверИсточник); 
НТТР.Получить(Адрес, ИмяВходящегоФайла); 
ВходящийФайл = Новый Файл(ИмяВходящегоФайла);</pre>
  <h3 id="hujO">Работа с COM-объектами</h3>
  <h3 id="hOep"><u>Как из одной базы 1С:Предприятие 8.0 перенести остатки товаров в другую базу, используя COM-соединение.</u></h3>
  <pre id="aOYU">Запрос = Новый Запрос; 
Запрос.Текст= &quot;ВЫБРАТЬ 
| ОстаткиТоваровОрганизацийОстатки.Организация КАК Организация, 
| ОстаткиТоваровОрганизацийОстатки.Номенклатура, 
| ОстаткиТоваровОрганизацийОстатки.ГТДОрганизации, 
| ОстаткиТоваровОрганизацийОстатки.СтранаПроисхождения, 
| ОстаткиТоваровОрганизацийОстатки.Комиссионер, 
| ОстаткиТоваровОрганизацийОстатки.КоличествоОстаток 
|ИЗ 
| РегистрНакопления.ОстаткиТоваровОрганизаций.Остатки(&amp;ДатаПереноса, ) КАК ОстаткиТоваровОрганизацийОстатки 
|ИТОГИ ПО 
| Организация&quot;; 
Запрос.УстановитьПараметр(&quot;ДатаПереноса&quot;, ДатаПереноса); 
V8 = Новый COMОбъект(&quot;V8.ComConnector&quot;); 
Попытка 
Открытие = V8.Connect(&quot;File=&quot;&quot;&quot; + Путь + &quot;&quot;&quot;;Usr=&quot;&quot;Usr1&quot;&quot;;&quot;); 
Исключение 
Предупреждение(&quot;База данных не открыта!!!&quot;); 
Возврат; 
КонецПопытки; 
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); 
МенеджерДокумента = Открытие.Документы.ОприходованиеТоваров; 
МенеджерНоменклатуры = Открытие.Справочники.Номенклатура; 
МенеджерОрганизаций = Открытие.Справочники.Организации; 
// Менеджеры остальных справочников: 
Пока Выборка.Следующий() Цикл 
Документ = МенеджерДокумента.СоздатьДокумент(); 
Код = Выборка.Организация.Код; 
Организация = МенеджерОрганизаций.НайтиПоКоду(Код); 
Если Организация.Пустая() Тогда 
Организация = МенеджерОрганизаций.СоздатьЭлемент(); 
Организация.Код = Код; 
// Остальные реквизиты: 
Организация.Записать(); 
КонецЕсли; 
// Обработка остальных реквизитов, справочников: 
ВыборкаПодчиненная = Выборка.Выбрать(); 
Пока ВыборкаПодчиненная.Следующий() Цикл 
// Поиск/перенос данных справочников 
// заполнение табличной части документа 
КонецЦикла; 
Документ.Записать(РежимЗаписиДокумента.Проведение); 
КонецЦикла;</pre>
  <p id="r5IN">Как выполнить запрос к произвольной базе данных SQL?</p>
  <pre id="qYEa">стрПодключения = &quot;Driver={SQL Server};&quot; 
стрПодключения = стрПодключения + ИмяСервера + &quot;;&quot;; 
стрПодключения = стрПодключения +&quot;Uid=&quot; + ИмяПользователя + &quot;;&quot;; 
стрПодключения = стрПодключения + &quot;Pwd=&quot; + Пароль + &quot;;&quot;; 
стрПодключения = стрПодключения + &quot;DataBase =&quot; + ИмяБазы + &quot;;&quot;; 
стрПодключения = стрПодключения + &quot;Pwd=&quot; + Пароль + &quot;;&quot;; 
Connection = Новый COMОбъект(&quot;ADODB.Connection&quot;); 
Connection.OpenServer = стрПодключения; 
RS = Новый COMОбъект(&quot;ADODB.Recordset&quot;); 
// Запрос к базе на языке SQL запросов. 
RS.Open(&quot;Select * from TradeUnit&quot;, Connection); 
Пока RS.EOF() = 0 Цикл 
// Можно обращаться и обрабатывать значения полей выборки. 
ИД = RS.Fields(&quot;ID&quot;).Value; 
Код = RS.Fields(&quot;Code&quot;).Value; 
// Обработка других полей 
RS.MoveNext(); 
КонецЦикла; 
RS.Close(); 
Connection.Close();</pre>
  <p id="KHzH">Отформатированные примеры из раздела &quot;Интеграции&quot; статьи <a href="https://infostart.ru/1c/articles/19343/" target="_blank">https://infostart.ru/1c/articles/19343/</a></p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@dc-zp/6WzvW7NksxH</guid><link>https://teletype.in/@dc-zp/6WzvW7NksxH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp</link><comments>https://teletype.in/@dc-zp/6WzvW7NksxH?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=dc-zp#comments</comments><dc:creator>dc-zp</dc:creator><title>Делаем красивое оформление кода в 1С конфигураторе</title><pubDate>Sat, 23 Sep 2023 23:22:06 GMT</pubDate><category>1C</category><description><![CDATA[Несколько простых настроек]]></description><content:encoded><![CDATA[
  <p id="A20O">1. Табуляция: </p>
  <ul id="lPtE">
    <li id="rT3Z">Символ табуляции &quot;│&quot; (code 2502)</li>
    <li id="mAiX">Цвет конструкции &quot;Прочее&quot; стиль: Линия отчета <a href="https://www.youtube.com/hashtag/ccc085" target="_blank">#CCC085</a> </li>
  </ul>
  <p id="qNME">2. Шрифт :  </p>
  <ul id="p8WU">
    <li id="iCVM">JetBrains Mono, 10 (<a href="https://www.jetbrains.com/lp/mono/" target="_blank">https://www.jetbrains.com/lp/mono/</a>)</li>
  </ul>
  <p id="08CO">3. Текущий идентификатор: </p>
  <ul id="DXUd">
    <li id="oNVt">Стиль: Цвет активности <a href="https://www.youtube.com/hashtag/facc1f" target="_blank">#FACC1F</a></li>
  </ul>

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