Из сборника задач по специалисту.

Часть текста задачи

Скрытый текстНеобходимо организовать возможность учета сборки комплектов. Сами комплекты определяются
    в справочнике «Номенклатура» наравне с обычными товарами, услугами.

         Операция сборки комплекта оформляется в системе с помощью документа «Сборка». В шапке
    этого документа указывается количество собираемых комплектов и сам комплект. Из чего
    собирается комплект (какие позиции в него входят и в каком количестве) определяется в
   табличной части документа. В системе должна храниться информация о плановом составе
   комплекта, однако в процессе сборки может происходить пересортица. В табличной части
   документа указывается фактический перечень и количество комплектующих, потребовавшихся
   для сборки.

         В состав комплекта не могут входить другие комплекты. Документ «Сборка» реализует следующие
   проводки:
          Дт «Основное производство» – Kт «Товары» (на списываемое количество комплектующих и их себестоимость);
          Дт «Товары» – Kт «Основное производство» (на собранное количество комплектов и сумму списанных материалов).

        Документ не должен проводиться, если соответствующих комплектующих не оказалось в компании.

        Документом «Расходная накладная» отражается продажа комплектов, отдельные детали
   продаваться не могут. В том случае, если каких-либо комплектов нет, то должна произойти сборка
   непосредственно при отгрузке покупателю. В этом случае делаются следующие проводки:
          Дт «Общехозяйственные затраты» – Kт «Товары» (на списываемое количество комплектующих и их себестоимость. Комплектующие списываются в
   составе и количестве соответствующемплановому составу комплекта);
          Дт «Товары» – Kт «Общехозяйственные затраты» (на собранное количество комплектов и сумму списанных материалов).
          Дт «Товары» – Kт «Общехозяйственные затраты» (на сумму срочной сборки, которая рассчитывается как 5 рублей за каждую комплектующую,
    участвующую в сборке).

   Например, если в состав комплекта входят 5 пузырьков и 1 коробка, то сумма сборки этого комплекта составит 5 X 5 + 1 X 5 = 30 рублей.

   Далее происходит списание всех продаваемых комплектов, проводки документа:
        Дт «Прибыли и убытки» – Km «Товары» на сумму себестоимости комплектов;
        Дт «Покупатели» – Km «Прибыли и убытки» на сумму в продажных ценах.

   В том случае, когда потребного количества комплектов нет, и недостающее количество не может быть собрано, документ не проводится.

Подскажите, где и в какой момент необходимо устанавливать блокировку данных , при проведении документа "Расходная накладная"

```1c
    Процедура ОбработкаПроведения(Отказ, РежимПроведения)

    Движения.РегистрБухгалтерии.Записывать = Истина;

    Запрос = Новый Запрос();
    Запрос.Текст = " Тут запрос на получение данных:
    | 1.Для списания комплекта (и проверка на его остатки),
    | 2.Состава комплекта, для тех случаев, если необходима срочная сборка (и так же проверка на остатки)";

    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
    Запрос.УстановитьПараметр("СчетТовары", ПланыСчетов.ПланСчетов.Товары);
    Запрос.УстановитьПараметр("ВидСубконтоНоменклатура",ПланыВидовХарактеристик.ПланВидовСубконто.Номенклатура);

    Пакеты = Запрос.ВыполнитьПакет();

    // в первом пакете - данные для списания комплекта
    ВыборкаКомплектов = Пакеты[1].Выбрать();
    // во втором пакете - данные состава комплекта
    ВыборкаСоставаКомплекта = Пакеты[2].Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

    // ???? ТУТ БЛОКИРОВКУ НА СЧЕТ "Товары" на списываемые комплекты ????
    // ???? ТУТ БЛОКИРОВКУ НА СЧЕТ "Товары" на списываемые комплектующие комплекта ????

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

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

    // спишем столько, сколько есть комплектов
    Если СписываемоеКоличество > 0 Тогда
    Движение = Движения.РегистрБухгалтерии.Добавить();
    Движение.СчетДт = ПланыСчетов.ПланСчетов.ПрибылиИУбытки;
    Движение.СчетКт = ПланыСчетов.ПланСчетов.Товары;
    Движение.КоличествоКт = СписываемоеКоличество;
    // -------------- какие то еще заполнения регистра------------------//

    Движение = Движения.РегистрБухгалтерии.Добавить();
    Движение.СчетДт = ПланыСчетов.ПланСчетов.Покупатели;
    Движение.СчетКт = ПланыСчетов.ПланСчетов.ПрибылиИУбытки;
    Движение.Сумма = СписываемоеКоличество / ВыборкаКомплектов.КоличествоОстаток * ВыборкаКомплектов.СуммаОстаток;
    // -------------- какие то еще заполнения регистра------------------//
    КонецЕсли;

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

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

    Движение = Движения.РегистрБухгалтерии.Добавить();
    Движение.СчетДт = ПланыСчетов.ПланСчетов.Товары;
    Движение.СчетКт = ПланыСчетов.ПланСчетов.ОсновноеПроизводство;
    Движение.КоличествоДт = ОсталосьСписать;
    Движение.КоличествоКт = ОсталосьСписать;
    // -------------- какие то еще заполнения регистра------------------//

    Если ОсталосьСписать > 0 Тогда
    Движение = Движения.РегистрБухгалтерии.Добавить();
    Движение.СчетДт = ПланыСчетов.ПланСчетов.ПрибылиИУбытки;
    Движение.СчетКт = ПланыСчетов.ПланСчетов.Товары;
    Движение.КоличествоКт = ОсталосьСписать;
    // -------------- какие то еще заполнения регистра------------------//

    Движение = Движения.РегистрБухгалтерии.Добавить();
    Движение.СчетДт = ПланыСчетов.ПланСчетов.Покупатели;
    Движение.СчетКт = ПланыСчетов.ПланСчетов.ПрибылиИУбытки;
    // -------------- какие то еще заполнения регистра------------------//
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    ВыборкаСоставаКомплекта.Сбросить();
    КонецЕсли;
    КонецЦикла;

    КонецПроцедуры
```

Для информации:
Субконто есть только у счета "Товары", субконто "Номенклатура" (там хранится и комплект, и комплектующие)
---
кто подскажет? Так или не так?
---
До запроса
---
до запроса и на счет "Товары" можно будет поставить блокировку только на комплект.
На комплектующие наверно тоже надо поставить?
---
сначала узнаем какие материалы списываем, блокируем, читаем остатки
---
Правильно ли я понимаю, что необходимо будет использовать менеджер временных таблиц, для того чтобы корректно произвести блокировку данных?
То есть, как я это вижу:

```1c
    // 1. Блокируем по счету "Товары" списываемые комплекты из ТЧ

    // 2. Формируем запрос
    Запрос = Новый Запрос();
    Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
    Запрос.Текст = " Тут запрос на получение данных:
    | 1.Для списания комплекта (и проверка на его остатки),
    | 2.Состава комплекта, для тех случаев, если необходима срочная сборка ";

    ПакетРезультатов = Запрос.ВыполнитьПакет();
    РезультатЗапросаНаСоставКомплекта = ПакетРезультатов[1];

    // 3. Блокируем по счету "Товары" списываемые комплектующие из пакета запроса
    // 4. Продолжаем выполнять запрос на проверку остатков для комплектующих
    // 5. далее все действия по записи данных в регистр
```

 Так? На сколько это правильно, и прокатит ли на экзамене?
---
Берете номенклатуру из табличной части и накладываете блокировку по этой номенклатуре до запроса.
---
Это я понимаю.
Посмотрите мой коммент (5)
Недостаточно блокировать только комплекты, я так понимаю нужно и комплектующие заблокировать. Тот метод что я указал по идеи выполняет задачу.
---
кто подскажет? Так или не так?