Продвинутый курс. Занятие №11

Первое занятие 2-го блока продвинутого курса.

Необходимо изучить следующие главы текущего блока.
Глава 1. Документы.
Глава 2. Регистры.

К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
залогиньтесь.

Если не активировали токен — посмотрите видео-инструкцию (видео N5)

Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.

комментариев 15 на “Продвинутый курс. Занятие №11”

  1. Задание выполнено.

    Запись и контроль остатков осуществляется с помощью подписок на события. Для получения старых движений используется событие “ПередЗаписью”. Контроль остаток осуществляется в событии “ПриЗаписи”. Передача параметров осуществляется с помощью использования свойства регистра “ДополнительныеСвойства”, в качестве параметра используется менеджер временных таблиц.

  2. Задание выполнила.Использовала подписку на событие “Обработка проведения” документа “Реализация товаров и услуг”. Информацию о передыдущем составе табличной части беру из регистра “Остатки товаров” с отбором по регистратору и помещаю во временную таблицу.

  3. Задание выполнила. В начале процедуры ОбработкаПроведения делаем запрос по физ таблице регистра Остатков чтобы выбрать движения которые были до изменения документа и помещаем их в виртуальную таблицу.
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст =
    “ВЫБРАТЬ
    | ОстаткиТоваров.Номенклатура КАК Номенклатура,
    | ОстаткиТоваров.Количество КАК Количество
    |ПОМЕСТИТЬ ДвижениеТоваров
    |ИЗ
    | РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
    |ГДЕ
    | ОстаткиТоваров.Регистратор = &Ссылка”;
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
    Результат = Запрос.Выполнить();
    Затем добавляем движения в регистр, записываем и в подписке на событие проверяем только те кол-во в которых не совпадает с ВТ или в ней отсутствует.
    Процедура КонтрольОстатковТМЦОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт

    Источник.Запрос.Текст =
    “ВЫБРАТЬ
    | Товары.Номенклатура КАК Товар
    |ПОМЕСТИТЬ СписокТоваров
    |ИЗ
    | (ВЫБРАТЬ
    |  РеализацияТоваровИУслугТовары.Номенклатура КАК Номенклатура,
    |  РеализацияТоваровИУслугТовары.Количество КАК Количество
    | ИЗ
    |  Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
    | ГДЕ
    |  РеализацияТоваровИУслугТовары.Ссылка = &Ссылка) КАК Товары
    |  ЛЕВОЕ СОЕДИНЕНИЕ ДвижениеТоваров КАК ДвижениеТоваров
    |  ПО Товары.Номенклатура = ДвижениеТоваров.Номенклатура
    |ГДЕ
    | (Товары.Количество <> ДвижениеТоваров.Количество) ИЛИ (ДвижениеТоваров.Номенклатура IS NULL)
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ОстаткиТоваровОстатки.Номенклатура,
    | ОстаткиТоваровОстатки.КоличествоОстаток
    |ИЗ
    | РегистрНакопления.ОстаткиТоваров.Остатки(, (Номенклатура) В (Выбрать Товар ИЗ СписокТоваров КАК Т)) КАК ОстаткиТоваровОстатки
    |ГДЕ
    | ОстаткиТоваровОстатки.КоличествоОстаток < 0
    |”;
    Источник.Запрос.УстановитьПараметр(“Ссылка”, Источник.Ссылка);
    Результат = Источник.Запрос.Выполнить();
    Если НЕ Результат.Пустой() Тогда

    Отказ = Истина;
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщить(“Образовались отрицательные остатки по товару “+ВыборкаДетальныеЗаписи.Номенклатура+” в количестве “+ВыборкаДетальныеЗаписи.КоличествоОстаток);
    КонецЦикла;
    КонецЕсли;

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

  4. Задание решено с помощью 2-х подписок на события: “ПередЗаписью”, “ОбработкаПроведения”. В подписке “ПередЗаписью” опеределяется режим записи документа: если это проведение, то производится сравнение текущей табличной части “Товары”  с физической таблицей регистра остатков (с установленным отбором по регистратору). Сравнение осуществляется по полям “Номенклатура”, “Количество”. В результате сравнения получаем таблицу, в которую записываются различающиеся строки. Эта таблица помещается в структуру “ДополнительныеСвойства” и используется для отбора по номенклатуре в параметрах виртуальной таблицы остатков в подписке “ОбработкаПроведения”.

  5. Задание выполнено. Для определения, что изменилось, необходимо получить состояние до записи и сравнить с тем, что записывается. Использовал ДополнительныеСвойства для хранения данных РН перед записью. Затем в событии ПриЗаписи (при помощи подписки на событие РН) анализирую в запросе, у какого товара менялось количество. Использую для этого следующее: для предыдущего состояния количество подставляю со знаком “-“. При суммировании количеств предудущего и текущего набора отбираю товары, у которых количество <> 0. Таким образом, получаю те товары, у которых количество менялось. И далее, в этом же запросе обращаюсь к остаткам и в параметрах отбираю номенклатуру, которая попала во временную таблицу согласно вышеприведенному условию. Также в запросе учитываю, что могла поменяться сама номенклатура, а не только количество.

  6. Задание выполнено.
    Никаких изменений в модуль документа не вносилось. Созданы 2 подписки на события, источниками для которых являются документы, формирующие расход по регистру ОстаткиТоваров. Одна подписка на событие ПередЗаписью, другая – на событие ОбработкаПроведения.
    В первой подписке сравнивается прошлое и текущее состояние документа и формируется таблица значений, содержащая товары, подлежащие контролю остатков, а также номера строк к которым следует привязать сообщения пользователю, если проверка будет не успешной. Эта таблица сохраняется в структуре ДополнительныеСвойства объекта и затем используется в обработчике подписки на событие ОбработкаПроведения. В нем проверяются остатки требуемых товаров, и если есть отрицательные, то транзакция отменяется и выдаются сообщения для пользователя с привязкам к соответствующим строкам.
    Код процедур обработчиков подписок:
    <code>
    Процедура КонтрольТоваровВДокументеПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    Если РежимЗаписи <> РежимЗаписиДокумента.Проведение Тогда
    Возврат;
    КонецЕсли;

    ТаблТовары = Источник.Товары.Выгрузить(, “НомерСтроки,Номенклатура,Количество”);

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

    Запрос.Текст = СтрЗаменить(Запрос.Текст,”РеализацияТоваровИУслуг”,Источник.Метаданные().Имя);
    Запрос.УстановитьПараметр(“ТоварыТек”, ТаблТовары);
    Запрос.УстановитьПараметр(“Ссылка”, Источник.Ссылка);
    Источник.ДополнительныеСвойства.Вставить(“ТоварыДляКонтроляОстатков”,Запрос.Выполнить().Выгрузить());

    КонецПроцедуры
     
    Процедура КонтрольОстатковТоваровОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
    Источник.Движения.ОстаткиТоваров.Записать();

    ТаблКонтроль = Источник.ДополнительныеСвойства.ТоварыДляКонтроляОстатков;
    Если ТаблКонтроль.Количество()=0 Тогда
    Возврат;
    КонецЕсли;

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

    Выборка = Результат.Выбрать();
    Пока Выборка.Следующий() Цикл
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = “Товара “+Выборка.Номенклатура+” не хватает в кол-ве “+Выборка.Нехватка+” единиц”;
    Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
    Сообщение.УстановитьДанные(Источник);
    Сообщение.Сообщить();
    КонецЦикла;

    КонецЕсли;
    КонецПроцедуры
    </code>

  7. В подписке на событие “ПроведениеДокумента” для события “ОбработкаПроведения” укажем в качестве источников все документы списания ТМЦ. В модуле “РаботаСДокументамиСервер” разместим обработчик  ПроведениеДокументаОбработкаПроведения”. Движения по регистру остатков формируются в обработке проведения документа. В обработчике подписки на событие получаем прежние движения по регистру для документа, записываем новые движения, получаем список номенклатуры, по которой были изменения, проводим контроль остатков. 

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

    Источник.Движения.ОстаткиТоваров.Записать();

    Запрос.Текст=СтрЗаменить(Запрос.Текст,”СтарыеДвижения”, “НовыеДвижения”);
    Результат = Запрос.Выполнить();

    Запрос.Текст= “ВЫБРАТЬ
    | НовыеДвижения.Номенклатура КАК Номенклатура,
    | НовыеДвижения.Количество КАК Количество,
    | ЕСТЬNULL(СтарыеДвижения.Количество, 0) КАК Количество1
    |ПОМЕСТИТЬ Движения
    |ИЗ
    | НовыеДвижения КАК НовыеДвижения
    | ЛЕВОЕ СОЕДИНЕНИЕ СтарыеДвижения КАК СтарыеДвижения
    | ПО НовыеДвижения.Номенклатура = СтарыеДвижения.Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | Движения.Номенклатура
    |ПОМЕСТИТЬ Товары
    |ИЗ
    | Движения КАК Движения
    |ГДЕ
    | Движения.Количество <> Движения.Количество1” ;
    Результат = Запрос.Выполнить();

    Запрос.Текст =
    “ВЫБРАТЬ
    | ОстаткиТоваровОстатки.Номенклатура,
    | ОстаткиТоваровОстатки.КоличествоОстаток
    |ИЗ
    | РегистрНакопления.ОстаткиТоваров.Остатки(,(Номенклатура) В (Выбрать Номенклатура ИЗ Товары КАК Т) ) КАК ОстаткиТоваровОстатки
    |ГДЕ
    | ОстаткиТоваровОстатки.КоличествоОстаток < 0”;
    Результат = Запрос.Выполнить();

    Если НЕ Результат.Пустой() Тогда
    Отказ = Истина;
    ВыборкаДетальныеЗаписи = Результат.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщить(“Образовались отрицательные остатки по товару “+ВыборкаДетальныеЗаписи.Номенклатура+” в количестве

    “+ВыборкаДетальныеЗаписи.КоличествоОстаток);
    КонецЦикла;
    Иначе
    Отказ = Ложь;
    КонецЕсли;

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

    Не совсем поняла, нужно ли при этой технологии проведения делать проверку остатков на момент времени документа при неоперативном проведении. Мне кажется,  достаточно делать проверку на текущий момент?

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

      • То есть будет ли разница при проверке отрицательных остатков на момент времени документа и на текущий момент? Ведь отрицательные остатки все равно появятся?

        • Как ни странно разница будет.
          Пример.
          Остаток товара А = 0 шт.
          01.06 Купили 100 шт. Товара А.
          10.06 Продали 300 шт. Товара А
          15.06 Купили 400 шт. Товара А.

          При проведении документа от 10.06 образуется отрицательный остаток, однако на актуальный момент времени отрицательного остатка не образуется.

          Тем не менее, в некоторых случаях эта ситуация считается нормальной (вспомним РАУЗ).

          • А может быть и такая ситуация:
            01.06 Купили 100 шт. Товара А.
            10.06 Продали 70 шт. Товара А
            15.06 Продали 30 шт. Товара А.
            И если мы исправляем кол-во в документе от 10-го числа с 70 на 90, то на момент времени документа проверка пройдет успешно и документ проведется, но на актуальный момент появятся отрицательные остатки в -20 единиц. Получается, что надо делать 2 проверки: и на момент документа, и на актуальный момент времени?

            • Можно утрировать ситуацию:
              01.06 Купили 100 шт. Товара А.
              10.06 Продали 70 шт. Товара А
              15.06 Продали 30 шт. Товара А.
              20.06 Купили 200 шт. Товара А.
              25.06 Продали 20 шт. Товара А.
              Исправляем количество в документе от 10-го числа с 70 на 90. Видимо, что проблемы будут с документом от 15.06. Исходя из этого нужно проверять достаточность остатков по каждому документу. Но эта задача на разумное время (процессорное время) не решается.

              Поэтому остатки контролируем только по текущему документу, а для выявления коллизий нам поможет последовательность.

  8. respublica 15.06.2011 в 14:31

    Задание выполнил.
    По условиям задания процедуру контроля остатков вынес в общий модуль подписки на событие обработки проведения. Использую “новую” технологию контроля остатков.  Момент с реализацией контроля остатков только по измененым строкам таб. части сделал в виде запроса, который вызываю перед записью движений ОстаткиТоваров:
    <code>
    ВЫБРАТЬ РеализацияТоваровИУслугТовары.Ссылка КАК Документ, РеализацияТоваровИУслугТовары.Номенклатура КАК Номенклатура, СУММА(РеализацияТоваровИУслугТовары.Количество) КАК Количество ПОМЕСТИТЬ ВТТабЧасть ИЗ Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары ГДЕ РеализацияТоваровИУслугТовары.Ссылка = &ТекДокумент СГРУППИРОВАТЬ ПО РеализацияТоваровИУслугТовары.Номенклатура, РеализацияТоваровИУслугТовары.Ссылка ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТТабЧасть.Номенклатура КАК Номенклатура ПОМЕСТИТЬ ВТТоварыДок ИЗ ВТТабЧасть КАК ВТТабЧасть ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров ПО ВТТабЧасть.Документ = ОстаткиТоваров.Регистратор И ВТТабЧасть.Номенклатура = ОстаткиТоваров.Номенклатура И ВТТабЧасть.Количество <> ОстаткиТоваров.Количество ИНДЕКСИРОВАТЬ ПО Номенклатура </code>
    Этот запрос выполняется в том случае, если в базе записаны движения по остаткам товаров.

  9. Задание выполнено. Кратко об идеологии:
    1. В подписке на событие ПередЗаписью набора записей регистра накопления Остатки формирую список номенклатуры, по которому в дальнейшем нужно контролировать остатки. Использую событие ПередЗаписью, т.к. на этом этапе можно обратиться к старым движениям регистратора. Ну и сравниваю с текущим набором, предварительно сгруппировав таблички на предмет дублей строк по номенклатуре. Результат (массив номенклатуры) помещают в ДополнительныеСвойства набора + туда же служебный флаг для последующей проверки
    <code>
    Процедура КонтрольОстаткаПередЗаписью(Источник, Отказ, Замещение) Экспорт

    Запрос = Новый Запрос;
    Запрос.УстановитьПараметр(“Регистратор”, Источник.Отбор.Регистратор.Значение);
    Запрос.УстановитьПараметр(“ВидДвижения”, ВидДвиженияНакопления.Расход);
    Запрос.УстановитьПараметр(“ТаблицаДвижений”, Источник.Выгрузить(, “Номенклатура, ВидДвижения, Количество”));

    Запрос.Текст =
    “ВЫБРАТЬ
    | ОстаткиТоваров.Номенклатура,
    | СУММА(ОстаткиТоваров.Количество) КАК Количество
    |ПОМЕСТИТЬ ВТПрошлыеДвижения
    |ИЗ
    | РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
    |ГДЕ
    | ОстаткиТоваров.Регистратор = &Регистратор
    | И ОстаткиТоваров.ВидДвижения = &ВидДвижения
    |
    |СГРУППИРОВАТЬ ПО
    | ОстаткиТоваров.Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ТаблицаДвижений.Номенклатура,
    | ТаблицаДвижений.Количество
    |ПОМЕСТИТЬ ВТТаблицаДвижений
    |ИЗ
    | &ТаблицаДвижений КАК ТаблицаДвижений
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ВТТаблицаДвижений.Номенклатура,
    | СУММА(ВТТаблицаДвижений.Количество) КАК Количество
    |ПОМЕСТИТЬ ВТТекущиеДвижения
    |ИЗ
    | ВТТаблицаДвижений КАК ВТТаблицаДвижений
    |
    |СГРУППИРОВАТЬ ПО
    | ВТТаблицаДвижений.Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    | ВТТекущиеДвижения.Номенклатура
    |ИЗ
    | ВТТаблицаДвижений КАК ВТТекущиеДвижения
    | ЛЕВОЕ СОЕДИНЕНИЕ ВТПрошлыеДвижения КАК ВТПрошлыеДвижения
    | ПО ВТТекущиеДвижения.Номенклатура = ВТПрошлыеДвижения.Номенклатура
    |ГДЕ
    | ВТТекущиеДвижения.Количество <> ЕСТЬNULL(ВТПрошлыеДвижения.Количество, 0)”;

    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда
    Источник.ДополнительныеСвойства(“ИспользоватьКонтроль”, Истина);
    Источник.ДополнительныеСвойства.Вставить(“СписокНоменклатуры”, РезультатЗапроса.Выгрузить().ВыгрузитьКолонку(“Номенклатура”));
    КонецЕсли; 
    КонецПроцедуры
    </code>
    2. В подписке на событие ПриЗаписи набора записей регистра накопления новые движения уже в БД, поэтому, предварительно проанализировав наличие служебного флага из допсвойств, формирую контроль остатков по фильтру номенклатуры из тех же допсвойств.

  10. Кононов Сергей 15.06.2011 в 08:41

    Задание выполнено.
    1. В обработке проведения документа реализации я получаю номенклатуру, которая была изменена(по отношению к тому, что уже было записано в регистр накопления Остатки) и так же выполняю запись в набор записей. Далее я передаю полученную мной выше измененную номенклатуру (через ДополнительныеСвойства объекта) в подписку на событие КонтрольОстатков, в которой и выполняю проверку остатков по переданной номенклатуре. Для передачи я использую менеджер временных таблиц. Приведу код обработки проведения:
    <cod>
     
    Процедура ОбработкаПроведения(Отказ, Режим)

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

    ЭтотОбъект.ДополнительныеСвойства.Вставить(“МенеджерВТ”, Запрос.МенеджерВременныхТаблиц);

    Движения.Продажи.Записывать = Истина;
    Движения.Продажи.Загрузить(ТаблицаЗаписей);

    Движения.ОстаткиТоваров.Загрузить(ТаблицаЗаписей);
    Движения.ОстаткиТоваров.Записать();

    КонецПроцедуры
    Процедура ОбработкаПроведения(Отказ, Режим)
     
    Движения.Взаиморасчеты.Записывать = Истина; Движение=Движения.Взаиморасчеты.ДобавитьПриход(); Движение.Период = Дата;
    Движение.Контрагент = Контрагент; Движение.Сумма = Товары.Итог(“Сумма”);    
    Запрос = Новый Запрос;
    ВТ = Новый МенеджерВременныхТаблиц; Запрос.МенеджерВременныхТаблиц = ВТ; Запрос.Текст =  “ВЫБРАТЬ
    | РеализацияТоваровИУслугТовары.Номенклатура |ПОМЕСТИТЬ Товары
    |ИЗ
    | Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
    | ПО РеализацияТоваровИУслугТовары.Ссылка = ОстаткиТоваров.Регистратор
    | И РеализацияТоваровИУслугТовары.Номенклатура = ОстаткиТоваров.Номенклатура
    | И РеализацияТоваровИУслугТовары.Количество = ОстаткиТоваров.Количество
    |ГДЕ
    | РеализацияТоваровИУслугТовары.Ссылка = &Ссылка
    |;
    | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ
    | РеализацияТоваровИУслугТовары.Номенклатура |ПОМЕСТИТЬ ИзмененныеТовары
    |ИЗ
    | Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
    |ГДЕ
    | РеализацияТоваровИУслугТовары.Ссылка = &Ссылка
    | И (НЕ РеализацияТоваровИУслугТовары.Номенклатура В | (ВЫБРАТЬ
    | Т.Номенклатура
    | ИЗ
    | Товары КАК Т))
    |;
    | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ
    | РеализацияТоваровИУслугТовары.Количество,
    | РеализацияТоваровИУслугТовары.Номенклатура, | ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
    | РеализацияТоваровИУслугТовары.Ссылка.Дата КАК Период
    |ИЗ
    | Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
    |ГДЕ
    | РеализацияТоваровИУслугТовары.Ссылка = &Ссылка”;
    Запрос.УстановитьПараметр(“Ссылка”, Ссылка); Результат = Запрос.Выполнить();    ТаблицаЗаписей = Результат.Выгрузить(); ЭтотОбъект.ДополнительныеСвойства.Вставить(“МенеджерВТ”, Запрос.МенеджерВременныхТаблиц); Движения.Продажи.Записывать = Истина; Движения.Продажи.Загрузить(ТаблицаЗаписей); Движения.ОстаткиТоваров.Загрузить(ТаблицаЗаписей);
    Движения.ОстаткиТоваров.Записать(); КонецПроцедуры
    </cod>
    Т.о. у меня в обработке проведения происходит запись, а в подписке контроль остатков:
    <cod>

    Процедура КонтрольОстатковОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    Сообщить(“Не хватает остатков по номенклатуре ” + ВыборкаДетальныеЗаписи.Номенклатура + ” в кол-ве: ”
    + (-ВыборкаДетальныеЗаписи.КоличествоОстаток));
    КонецЦикла;

    КонецЕсли;

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

    </cod>