Продвинутый курс. Занятие №11
Первое занятие 2-го блока продвинутого курса.
Необходимо изучить следующие главы текущего блока.
Глава 1. Документы.
Глава 2. Регистры.
К сожалению, у Вас недостаточно прав для просмотра этой записи. Если Вы еще не залогинены на сайте
— залогиньтесь.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —
напишите нам на e-mail поддержки.
Задание выполнено.
Запись и контроль остатков осуществляется с помощью подписок на события. Для получения старых движений используется событие “ПередЗаписью”. Контроль остаток осуществляется в событии “ПриЗаписи”. Передача параметров осуществляется с помощью использования свойства регистра “ДополнительныеСвойства”, в качестве параметра используется менеджер временных таблиц.
Задание выполнила.Использовала подписку на событие “Обработка проведения” документа “Реализация товаров и услуг”. Информацию о передыдущем составе табличной части беру из регистра “Остатки товаров” с отбором по регистратору и помещаю во временную таблицу.
Задание выполнила. В начале процедуры ОбработкаПроведения делаем запрос по физ таблице регистра Остатков чтобы выбрать движения которые были до изменения документа и помещаем их в виртуальную таблицу.
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст =
“ВЫБРАТЬ
| ОстаткиТоваров.Номенклатура КАК Номенклатура,
| ОстаткиТоваров.Количество КАК Количество
|ПОМЕСТИТЬ ДвижениеТоваров
|ИЗ
| РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
|ГДЕ
| ОстаткиТоваров.Регистратор = &Ссылка”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Затем добавляем движения в регистр, записываем и в подписке на событие проверяем только те кол-во в которых не совпадает с ВТ или в ней отсутствует.
Процедура КонтрольОстатковТМЦОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
Источник.Запрос.Текст =
“ВЫБРАТЬ
| Товары.Номенклатура КАК Товар
|ПОМЕСТИТЬ СписокТоваров
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровИУслугТовары.Номенклатура КАК Номенклатура,
| РеализацияТоваровИУслугТовары.Количество КАК Количество
| ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
| ГДЕ
| РеализацияТоваровИУслугТовары.Ссылка = &Ссылка) КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ ДвижениеТоваров КАК ДвижениеТоваров
| ПО Товары.Номенклатура = ДвижениеТоваров.Номенклатура
|ГДЕ
| (Товары.Количество <> ДвижениеТоваров.Количество) ИЛИ (ДвижениеТоваров.Номенклатура IS NULL)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура,
| ОстаткиТоваровОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(, (Номенклатура) В (Выбрать Товар ИЗ СписокТоваров КАК Т)) КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.КоличествоОстаток < 0
|”;
Источник.Запрос.УстановитьПараметр(“Ссылка”, Источник.Ссылка);
Результат = Источник.Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Отказ = Истина;
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(“Образовались отрицательные остатки по товару “+ВыборкаДетальныеЗаписи.Номенклатура+” в количестве “+ВыборкаДетальныеЗаписи.КоличествоОстаток);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Задание решено с помощью 2-х подписок на события: “ПередЗаписью”, “ОбработкаПроведения”. В подписке “ПередЗаписью” опеределяется режим записи документа: если это проведение, то производится сравнение текущей табличной части “Товары” с физической таблицей регистра остатков (с установленным отбором по регистратору). Сравнение осуществляется по полям “Номенклатура”, “Количество”. В результате сравнения получаем таблицу, в которую записываются различающиеся строки. Эта таблица помещается в структуру “ДополнительныеСвойства” и используется для отбора по номенклатуре в параметрах виртуальной таблицы остатков в подписке “ОбработкаПроведения”.
Задание выполнено. Для определения, что изменилось, необходимо получить состояние до записи и сравнить с тем, что записывается. Использовал ДополнительныеСвойства для хранения данных РН перед записью. Затем в событии ПриЗаписи (при помощи подписки на событие РН) анализирую в запросе, у какого товара менялось количество. Использую для этого следующее: для предыдущего состояния количество подставляю со знаком “-“. При суммировании количеств предудущего и текущего набора отбираю товары, у которых количество <> 0. Таким образом, получаю те товары, у которых количество менялось. И далее, в этом же запросе обращаюсь к остаткам и в параметрах отбираю номенклатуру, которая попала во временную таблицу согласно вышеприведенному условию. Также в запросе учитываю, что могла поменяться сама номенклатура, а не только количество.
Задание выполнено.
Никаких изменений в модуль документа не вносилось. Созданы 2 подписки на события, источниками для которых являются документы, формирующие расход по регистру ОстаткиТоваров. Одна подписка на событие ПередЗаписью, другая – на событие ОбработкаПроведения.
В первой подписке сравнивается прошлое и текущее состояние документа и формируется таблица значений, содержащая товары, подлежащие контролю остатков, а также номера строк к которым следует привязать сообщения пользователю, если проверка будет не успешной. Эта таблица сохраняется в структуре ДополнительныеСвойства объекта и затем используется в обработчике подписки на событие ОбработкаПроведения. В нем проверяются остатки требуемых товаров, и если есть отрицательные, то транзакция отменяется и выдаются сообщения для пользователя с привязкам к соответствующим строкам.
Код процедур обработчиков подписок:
<code>
Процедура КонтрольТоваровВДокументеПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если РежимЗаписи <> РежимЗаписиДокумента.Проведение Тогда
Возврат;
КонецЕсли;
ТаблТовары = Источник.Товары.Выгрузить(, “НомерСтроки,Номенклатура,Количество”);
Запрос = Новый Запрос(“ВЫБРАТЬ
| ТоварыТек.Номенклатура КАК Номенклатура,
| ТоварыТек.Количество,
| ТоварыТек.НомерСтроки
|ПОМЕСТИТЬ ТоварыТек
|ИЗ
| &ТоварыТек КАК ТоварыТек
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТоварыТек.Номенклатура КАК Номенклатура,
| СУММА(ТоварыТек.Количество) КАК Количество,
| МИНИМУМ(ТоварыТек.НомерСтроки) КАК НомерСтроки
|ПОМЕСТИТЬ Товары
|ИЗ
| ТоварыТек КАК ТоварыТек
|
|СГРУППИРОВАТЬ ПО
| ТоварыТек.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблЧастьТовары.Номенклатура КАК Номенклатура,
| СУММА(ТаблЧастьТовары.Количество) КАК Количество
|ПОМЕСТИТЬ ТоварыПрежн
|ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК ТаблЧастьТовары
|ГДЕ
| ТаблЧастьТовары.Ссылка = &Ссылка
| И ТаблЧастьТовары.Ссылка.Проведен
|
|СГРУППИРОВАТЬ ПО
| ТаблЧастьТовары.Номенклатура
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.НомерСтроки КАК НомерСтроки
|ИЗ
| Товары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ ТоварыПрежн КАК ТоварыПрежн
| ПО Товары.Номенклатура = ТоварыПрежн.Номенклатура
|ГДЕ
| Товары.Количество <> ЕСТЬNULL(ТоварыПрежн.Количество, 0)”);
Запрос.Текст = СтрЗаменить(Запрос.Текст,”РеализацияТоваровИУслуг”,Источник.Метаданные().Имя);
Запрос.УстановитьПараметр(“ТоварыТек”, ТаблТовары);
Запрос.УстановитьПараметр(“Ссылка”, Источник.Ссылка);
Источник.ДополнительныеСвойства.Вставить(“ТоварыДляКонтроляОстатков”,Запрос.Выполнить().Выгрузить());
КонецПроцедуры
Процедура КонтрольОстатковТоваровОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
Источник.Движения.ОстаткиТоваров.Записать();
ТаблКонтроль = Источник.ДополнительныеСвойства.ТоварыДляКонтроляОстатков;
Если ТаблКонтроль.Количество()=0 Тогда
Возврат;
КонецЕсли;
Запрос = Новый Запрос(“ВЫБРАТЬ
| ТоварыДляКонтроля.Номенклатура КАК Номенклатура,
| ТоварыДляКонтроля.НомерСтроки
|ПОМЕСТИТЬ ТоварыДляКонтроля
|ИЗ
| &ТоварыДляКонтроля КАК ТоварыДляКонтроля
|
|ИНДЕКСИРОВАТЬ ПО
| Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура,
| -ОстаткиТоваровОстатки.КоличествоОстаток КАК Нехватка,
| МИНИМУМ(ТоварыДляКонтроля.НомерСтроки) КАК НомерСтроки
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| ,
| Номенклатура В
| (ВЫБРАТЬ
| ТоварыДляКонтроля.Номенклатура
| ИЗ
| ТоварыДляКонтроля КАК ТоварыДляКонтроля)) КАК ОстаткиТоваровОстатки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТоварыДляКонтроля КАК ТоварыДляКонтроля
| ПО ОстаткиТоваровОстатки.Номенклатура = ТоварыДляКонтроля.Номенклатура
|ГДЕ
| ОстаткиТоваровОстатки.КоличествоОстаток < 0
|
|СГРУППИРОВАТЬ ПО
| ОстаткиТоваровОстатки.Номенклатура,
| ОстаткиТоваровОстатки.КоличествоОстаток”);
Запрос.УстановитьПараметр(“ТоварыДляКонтроля”, ТаблКонтроль);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Отказ = Истина;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара “+Выборка.Номенклатура+” не хватает в кол-ве “+Выборка.Нехватка+” единиц”;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(Источник);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
</code>
В подписке на событие “ПроведениеДокумента” для события “ОбработкаПроведения” укажем в качестве источников все документы списания ТМЦ. В модуле “РаботаСДокументамиСервер” разместим обработчик ПроведениеДокументаОбработкаПроведения”. Движения по регистру остатков формируются в обработке проведения документа. В обработчике подписки на событие получаем прежние движения по регистру для документа, записываем новые движения, получаем список номенклатуры, по которой были изменения, проводим контроль остатков.
Процедура ПроведениеДокументаОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
МенеджерВТ = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.УстановитьПараметр(“Ссылка”, Источник.Ссылка);
Запрос.Текст =
“ВЫБРАТЬ
| ОстаткиТоваров.Номенклатура,
| ОстаткиТоваров.Количество
|ПОМЕСТИТЬ СтарыеДвижения
|ИЗ
| РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
|ГДЕ
| ОстаткиТоваров.Регистратор = &Ссылка
|
|ИНДЕКСИРОВАТЬ ПО ОстаткиТоваров.Номенклатура
| “;
Результат = Запрос.Выполнить();
Источник.Движения.ОстаткиТоваров.Записать();
Запрос.Текст=СтрЗаменить(Запрос.Текст,”СтарыеДвижения”, “НовыеДвижения”);
Результат = Запрос.Выполнить();
Запрос.Текст= “ВЫБРАТЬ
| НовыеДвижения.Номенклатура КАК Номенклатура,
| НовыеДвижения.Количество КАК Количество,
| ЕСТЬ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. Исходя из этого нужно проверять достаточность остатков по каждому документу. Но эта задача на разумное время (процессорное время) не решается.
Поэтому остатки контролируем только по текущему документу, а для выявления коллизий нам поможет последовательность.
Задание выполнил.
По условиям задания процедуру контроля остатков вынес в общий модуль подписки на событие обработки проведения. Использую “новую” технологию контроля остатков. Момент с реализацией контроля остатков только по измененым строкам таб. части сделал в виде запроса, который вызываю перед записью движений ОстаткиТоваров:
<code>
ВЫБРАТЬ РеализацияТоваровИУслугТовары.Ссылка КАК Документ, РеализацияТоваровИУслугТовары.Номенклатура КАК Номенклатура, СУММА(РеализацияТоваровИУслугТовары.Количество) КАК Количество ПОМЕСТИТЬ ВТТабЧасть ИЗ Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары ГДЕ РеализацияТоваровИУслугТовары.Ссылка = &ТекДокумент СГРУППИРОВАТЬ ПО РеализацияТоваровИУслугТовары.Номенклатура, РеализацияТоваровИУслугТовары.Ссылка ИНДЕКСИРОВАТЬ ПО Номенклатура ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВТТабЧасть.Номенклатура КАК Номенклатура ПОМЕСТИТЬ ВТТоварыДок ИЗ ВТТабЧасть КАК ВТТабЧасть ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров ПО ВТТабЧасть.Документ = ОстаткиТоваров.Регистратор И ВТТабЧасть.Номенклатура = ОстаткиТоваров.Номенклатура И ВТТабЧасть.Количество <> ОстаткиТоваров.Количество ИНДЕКСИРОВАТЬ ПО Номенклатура </code>
Этот запрос выполняется в том случае, если в базе записаны движения по остаткам товаров.
Задание выполнено. Кратко об идеологии:
1. В подписке на событие ПередЗаписью набора записей регистра накопления Остатки формирую список номенклатуры, по которому в дальнейшем нужно контролировать остатки. Использую событие ПередЗаписью, т.к. на этом этапе можно обратиться к старым движениям регистратора. Ну и сравниваю с текущим набором, предварительно сгруппировав таблички на предмет дублей строк по номенклатуре. Результат (массив номенклатуры) помещают в ДополнительныеСвойства набора + туда же служебный флаг для последующей проверки
<code>
Процедура КонтрольОстаткаПередЗаписью(Источник, Отказ, Замещение) Экспорт
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(“Регистратор”, Источник.Отбор.Регистратор.Значение);
Запрос.УстановитьПараметр(“ВидДвижения”, ВидДвиженияНакопления.Расход);
Запрос.УстановитьПараметр(“ТаблицаДвижений”, Источник.Выгрузить(, “Номенклатура, ВидДвижения, Количество”));
Запрос.Текст =
“ВЫБРАТЬ
| ОстаткиТоваров.Номенклатура,
| СУММА(ОстаткиТоваров.Количество) КАК Количество
|ПОМЕСТИТЬ ВТПрошлыеДвижения
|ИЗ
| РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
|ГДЕ
| ОстаткиТоваров.Регистратор = &Регистратор
| И ОстаткиТоваров.ВидДвижения = &ВидДвижения
|
|СГРУППИРОВАТЬ ПО
| ОстаткиТоваров.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ТаблицаДвижений.Номенклатура,
| ТаблицаДвижений.Количество
|ПОМЕСТИТЬ ВТТаблицаДвижений
|ИЗ
| &ТаблицаДвижений КАК ТаблицаДвижений
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТТаблицаДвижений.Номенклатура,
| СУММА(ВТТаблицаДвижений.Количество) КАК Количество
|ПОМЕСТИТЬ ВТТекущиеДвижения
|ИЗ
| ВТТаблицаДвижений КАК ВТТаблицаДвижений
|
|СГРУППИРОВАТЬ ПО
| ВТТаблицаДвижений.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТТекущиеДвижения.Номенклатура
|ИЗ
| ВТТаблицаДвижений КАК ВТТекущиеДвижения
| ЛЕВОЕ СОЕДИНЕНИЕ ВТПрошлыеДвижения КАК ВТПрошлыеДвижения
| ПО ВТТекущиеДвижения.Номенклатура = ВТПрошлыеДвижения.Номенклатура
|ГДЕ
| ВТТекущиеДвижения.Количество <> ЕСТЬNULL(ВТПрошлыеДвижения.Количество, 0)”;
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
Источник.ДополнительныеСвойства(“ИспользоватьКонтроль”, Истина);
Источник.ДополнительныеСвойства.Вставить(“СписокНоменклатуры”, РезультатЗапроса.Выгрузить().ВыгрузитьКолонку(“Номенклатура”));
КонецЕсли;
КонецПроцедуры
</code>
2. В подписке на событие ПриЗаписи набора записей регистра накопления новые движения уже в БД, поэтому, предварительно проанализировав наличие служебного флага из допсвойств, формирую контроль остатков по фильтру номенклатуры из тех же допсвойств.
Задание выполнено.
1. В обработке проведения документа реализации я получаю номенклатуру, которая была изменена(по отношению к тому, что уже было записано в регистр накопления Остатки) и так же выполняю запись в набор записей. Далее я передаю полученную мной выше измененную номенклатуру (через ДополнительныеСвойства объекта) в подписку на событие КонтрольОстатков, в которой и выполняю проверку остатков по переданной номенклатуре. Для передачи я использую менеджер временных таблиц. Приведу код обработки проведения:
<cod>
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;
Движение = Движения.Взаиморасчеты.ДобавитьПриход();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Сумма = Товары.Итог(“Сумма”);
Запрос = Новый Запрос;
ВТ = Новый МенеджерВременныхТаблиц;
Запрос.МенеджерВременныхТаблиц = ВТ;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваровИУслугТовары.Номенклатура
|ПОМЕСТИТЬ Товары
|ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
| ПО РеализацияТоваровИУслугТовары.Ссылка = ОстаткиТоваров.Регистратор
| И РеализацияТоваровИУслугТовары.Номенклатура = ОстаткиТоваров.Номенклатура
| И РеализацияТоваровИУслугТовары.Количество = ОстаткиТоваров.Количество
|ГДЕ
| РеализацияТоваровИУслугТовары.Ссылка = &Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РеализацияТоваровИУслугТовары.Номенклатура
|ПОМЕСТИТЬ ИзмененныеТовары
|ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
|ГДЕ
| РеализацияТоваровИУслугТовары.Ссылка = &Ссылка
| И (НЕ РеализацияТоваровИУслугТовары.Номенклатура В
| (ВЫБРАТЬ
| Т.Номенклатура
| ИЗ
| Товары КАК Т))
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| РеализацияТоваровИУслугТовары.Количество,
| РеализацияТоваровИУслугТовары.Номенклатура,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| РеализацияТоваровИУслугТовары.Ссылка.Дата КАК Период
|ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
|ГДЕ
| РеализацияТоваровИУслугТовары.Ссылка = &Ссылка”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
ТаблицаЗаписей = Результат.Выгрузить();
ЭтотОбъект.ДополнительныеСвойства.Вставить(“МенеджерВТ”, Запрос.МенеджерВременныхТаблиц);
Движения.Продажи.Записывать = Истина;
Движения.Продажи.Загрузить(ТаблицаЗаписей);
Движения.ОстаткиТоваров.Загрузить(ТаблицаЗаписей);
Движения.ОстаткиТоваров.Записать();
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина; Движение=Движения.Взаиморасчеты.ДобавитьПриход(); Движение.Период = Дата;
Движение.Контрагент = Контрагент; Движение.Сумма = Товары.Итог(“Сумма”);
Запрос = Новый Запрос;
ВТ = Новый МенеджерВременныхТаблиц; Запрос.МенеджерВременныхТаблиц = ВТ; Запрос.Текст = “ВЫБРАТЬ
| РеализацияТоваровИУслугТовары.Номенклатура |ПОМЕСТИТЬ Товары
|ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров КАК ОстаткиТоваров
| ПО РеализацияТоваровИУслугТовары.Ссылка = ОстаткиТоваров.Регистратор
| И РеализацияТоваровИУслугТовары.Номенклатура = ОстаткиТоваров.Номенклатура
| И РеализацияТоваровИУслугТовары.Количество = ОстаткиТоваров.Количество
|ГДЕ
| РеализацияТоваровИУслугТовары.Ссылка = &Ссылка
|;
| |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ
| РеализацияТоваровИУслугТовары.Номенклатура |ПОМЕСТИТЬ ИзмененныеТовары
|ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
|ГДЕ
| РеализацияТоваровИУслугТовары.Ссылка = &Ссылка
| И (НЕ РеализацияТоваровИУслугТовары.Номенклатура В | (ВЫБРАТЬ
| Т.Номенклатура
| ИЗ
| Товары КАК Т))
|;
| |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ
| РеализацияТоваровИУслугТовары.Количество,
| РеализацияТоваровИУслугТовары.Номенклатура, | ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| РеализацияТоваровИУслугТовары.Ссылка.Дата КАК Период
|ИЗ
| Документ.РеализацияТоваровИУслуг.Товары КАК РеализацияТоваровИУслугТовары
|ГДЕ
| РеализацияТоваровИУслугТовары.Ссылка = &Ссылка”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка); Результат = Запрос.Выполнить(); ТаблицаЗаписей = Результат.Выгрузить(); ЭтотОбъект.ДополнительныеСвойства.Вставить(“МенеджерВТ”, Запрос.МенеджерВременныхТаблиц); Движения.Продажи.Записывать = Истина; Движения.Продажи.Загрузить(ТаблицаЗаписей); Движения.ОстаткиТоваров.Загрузить(ТаблицаЗаписей);
Движения.ОстаткиТоваров.Записать(); КонецПроцедуры
</cod>
Т.о. у меня в обработке проведения происходит запись, а в подписке контроль остатков:
<cod>
Процедура КонтрольОстатковОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Источник.ДополнительныеСвойства.МенеджерВТ;
Запрос.Текст =
“ВЫБРАТЬ
| ОстаткиТоваровОстатки.Номенклатура,
| ОстаткиТоваровОстатки.КоличествоОстаток
|ИЗ
| РегистрНакопления.ОстаткиТоваров.Остатки(
| &МоментВремени,
| (Номенклатура В
| (ВЫБРАТЬ
| Т.Номенклатура
| ИЗ
| ИзмененныеТовары КАК Т))) КАК ОстаткиТоваровОстатки
|ГДЕ
| ОстаткиТоваровОстатки.КоличествоОстаток < 0”;
Запрос.УстановитьПараметр(“МоментВремени”, Новый Граница(Источник.Дата, ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Ссылка”, Источник.Ссылка);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
Отказ = Истина;
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Сообщить(“Не хватает остатков по номенклатуре ” + ВыборкаДетальныеЗаписи.Номенклатура + ” в кол-ве: ”
+ (-ВыборкаДетальныеЗаписи.КоличествоОстаток));
КонецЦикла;
КонецЕсли;
КонецПроцедуры
</cod>