Paste1C
  • API
  • О проекте
  • Контакты
  • Регистрация
  • Вход
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   
    //  1. Очистка старых движений регистра
    // Движения.СвободныеОстатки.Очистить(); - Напоминаю, если проверять через отладчик Движения.СвободныеОстатки
	// то там ничего нет, соответсвенно и нечего очищать
	
    Движения.СвободныеОстатки.Записывать = Истина;  // Установив у свойсвта ЗАПИСЫВАТЬ ИСТИНА - мы подготовили, что бы он записал наши 
    Движения.Записать();							// движения. А тут тут же записываем их. Так как между 7 и 8 строкой кода  ничего нет.
													// она записал пустые движения ( Пустой набор записей), это сделано для того, что бы 
													// старые движения, проводимого документа очистились. То есть когда мы перепроводим 
													// документ его предыдущие данные очистились и не влияли на дальнейший код 
													// ( а именно запрос, так как в запросе мы обращаемся к регистру и не хотим, 
													// что бы он помнил старые данные документа)
  
    //  2. Установка флага записи движений в конце транзакции
    Движения.СвободныеОстатки.Записывать = Истина;	// заново возводим это свойство в Истину, 
													// что бы наши новые данные документа, оказались в регистре


   
    //  3. Получение запросом данных из ТАБЛИЧНОЙ ЧАСТИ документ и соединение их с виртуальной таблицей регистра Остатки
    Запрос = Новый Запрос;
    Запрос.Текст =
		// 1ый пакет, мы берем данные из ТЧ те, которые дальше будем передавать в регистр, предварительно сгруппировав
		// К примеру:
		// Помидор 10
		// Помидор 20
		// Груша 10 
		// После первого пакета будет у нас
		// Помидор 30
		// Груша 10
		
        "ВЫБРАТЬ
        |   Товары.Номенклатура КАК Номенклатура,
        |   СУММА(Товары.Количество) КАК Количество
        |ПОМЕСТИТЬ ВТ_ТЧ
        |ИЗ
        |   Документ.РеализацияТоваровУслуг.Товары КАК Товары
        |ГДЕ
        |   Товары.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |   Товары.Номенклатура
        |
        |ИНДЕКСИРОВАТЬ ПО
        |   Номенклатура
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////|

		// 2ой пакет, мы сгруппированные данные соединяем с виртуальной таблицей Остатки, так что бы он нашел одинаковые поля в 1ой таблице и
		// и во 2ой и соединил их в итоге получится
		// Помидор 30 40
		// Груша 10 5
		// где 10 и 5 это остаток из виртуальной таблицы Остатки
        |ВЫБРАТЬ
        |   ПРЕДСТАВЛЕНИЕССЫЛКИ(Товары.Номенклатура) КАК НоменклатураПредставление,
        |   ВТ_ТЧ.Количество КАК Количество,
        |   ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК Остаток
        |ИЗ
        |   ВТ_ТЧ КАК ВТ_ТЧ
        |       ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки(
        |               &МоментВремени,
        |               Номенклатура В
        |                   (ВЫБРАТЬ
        |                       ВТ_ТЧ.Номенклатура КАК Номенклатура
        |                   ИЗ
        |                       ВТ_ТЧ КАК ВТ_ТЧ)) КАК Остатки
        |       ПО ВТ_ТЧ.Номенклатура = Остатки.Номенклатура";
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
    Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
    РезультатЗапроса = Запрос.Выполнить();
   
    ВыборкаТовары = РезультатЗапроса.Выбрать();
   
    Пока ВыборкаТовары.Следующий() Цикл
       
        //  4. Проверка на достаточность товаров
        Дефицит = ВыборкаТовары.Количество - ВыборкаТовары.Остаток; 
        Если Дефицит>0 Тогда
            Отказ = Истина;
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Товара "+ВыборкаТовары.НоменклатураПредставление+" недостаточно в количестве "+Дефицит+" шт.";
            Сообщение.Сообщить();
        КонецЕсли;
       
        //  5. Переход в начало цикла, если нашли товар, у которого Остаток меньше Количества
        Если Отказ Тогда // тоже самое -  Если Отказ = Истина Тогда
            Продолжить;
        КонецЕсли;
       
        //  6. Передача данных из запроса в Регистр
        Движение = Движения.СвободныеОстатки.ДобавитьРасход();
        Движение.Период = Дата;
        Движение.Номенклатура = ВыборкаТовары.Номенклатура;
        Движение.Количество = ВыборкаТовары.Количество;
    КонецЦикла;

КонецПроцедуры // <------ Вот тут произодет запись новых движений в базу данных, благодаря Записывать = Истина из 16 строки кода
{"contextData":{"NaN":{}},"contextMarkers":[]}

Публикация кода

Размещая информацию на сайте, Вы подтверждаете согласие со всеми пунктами Пользовательского соглашения

Замечание к коду:

  • Загрузить конфигурацию
    • ERP 2.4
    • Управление торговлей 10.3
    • Управление торговлей 11.4
    • Бухгалтерия 2.0
    • Бухгалтерия 3.0
    • ЗУП 3.1
    • Розница 2.3
    • УНФ 1.6
    • БСП 3.1
  • Тема
    • Светлая
    • Светлая c подсветкой запросов
    • Темная
    • Темная с подсветкой запросов
  • Режим запроса
  • Поделиться
Код:
Напоминание старой методики с подробными комментариями

© Александр Шкураев 2025