Корректировка движений документа

26.05.19

Разработка - Универсальные функции

Корректировка движений документа после его проведения по типовому алгоритму.

Файлы

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование Скачано Купить файл
Корректировка движений документа:
.epf 6,67Kb
14 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

Оформите подписку на компанию для решения рабочих задач

Оформить подписку и скачать решение со скидкой

Данная статья инициирована тем, что приводимая ниже информация не была найдена мной на сайте в открытом виде. Поэтому мне пришлось потратить несколько драгоценных минут, чтобы все это сделать самому.

Суть кода - удалить/добавить/скорректировать движения документа "извне". Не трогая сам документ. Для "подстановки" движений в регистр документ должен быть записан, желательно (но не обязательно) проведен. Встречал случаи, когда делаешь выверку данных и не понимаешь, откуда лезут движения; тратишь кучу времени и потом выясняешь, что движения делает не проведенный документ; долго и с выражением ругаешься :) 

Делают это обычно тремя методами:

  1) делают подписку на событие ПриПроведении

  2) делают дописку в конце процедуры ОбработкаПроведения в модуле документа (стало особенно актуально с появлением расширения)

  3) делают внешнюю обработку, которая правит движения по таймеру или по ручному нажатию на кнопку

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

1. Дописка движений с помощью подписки на событие (на примере УТ 11)

Добавляем общий серверный модуль:

Пример создания модуля для подписки на событие

Добавляем подписку на событие:

подписка на событие

Ниже сам модуль

Процедура РТУ_ПроведениеОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
    // получаем ссылку на документ
    Регистратор=Источник.Ссылка;
    
    НаборЗаписей = РегистрыНакопления.СебестоимостьТоваров.СоздатьНаборЗаписей();
    НаборЗаписей.Отбор.Регистратор.Установить(Регистратор);
    НаборЗаписей.Прочитать();
    
    // предыдущие движения удаляем
    // можно этого не делать, тогда движения добавятся к существующим
    НаборЗаписей.Очистить();
    
    Для каждого Строка из Регистратор.ВидыЗапасов Цикл
        // Делаем новые движения
        ЗаписьРегистра = НаборЗаписей.Добавить();
        ЗаписьРегистра.ВидДвижения = ВидДвиженияНакопления.Приход;   // эта строчка только для регистров остатков
        ЗаписьРегистра.Период=Регистратор.Дата;
        ЗаписьРегистра.Регистратор=Регистратор;
        
        ЗаписьРегистра.АналитикаУчетаНоменклатуры=Строка.АналитикаУчетаНоменклатуры;
        ЗаписьРегистра.РазделУчета=Перечисления.РазделыУчетаСебестоимостиТоваров.ТоварыНаСкладах;
        ЗаписьРегистра.ВидЗапасов=Строка.ВидЗапасов;
        ЗаписьРегистра.Организация=Регистратор.Организация;
        ЗаписьРегистра.ВидДеятельностиНДС=Перечисления.ТипыНалогообложенияНДС.ПродажаОблагаетсяНДС;
        // при необходимости добавить заполнение остальных измерений
        
        ЗаписьРегистра.Количество=Строка.Количество;
        ЗаписьРегистра.Стоимость=Строка.СуммаСНДС;
        ЗаписьРегистра.СтоимостьРегл=Строка.СуммаСНДС;
        ЗаписьРегистра.СтоимостьУпр=Строка.СуммаСНДС;
        // при необходимости добавить заполнение остальных ресурсов
        
        ЗаписьРегистра.ХозяйственнаяОперация=Перечисления.ХозяйственныеОперации.РеализацияКлиенту;
        // при необходимости добавить заполнение остальных реквизитов
    КонецЦикла;
    
    // все. фиксируем проводки в регистре
    НаборЗаписей.Записать();
КонецПроцедуры

Правильность кода в смысле бизнес-правил не преследовалась. Это просто пример того, как можно перезаполнить движения документа по какому-то из регистров, в качестве "жертвы" был выбран СебестоимостьТоваров.

Ниже еще вариант правки кода в подписке на событие (для конфигурации БП20 - меняем счет списания для документа Списание товаров):

Процедура ОбработкаПроведенияСписаниеТоваровОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
	// тут движения уже отфильтрованы по Регистратору,  потому просто берем их и используем
	НаборДвижений = Источник.Движения.Хозрасчетный;
	ТаблицаПроводок = НаборДвижений.Выгрузить();
	
	// тут приведена некоторая функция, которая гипотетически, по какому-то алгоритму, получает счет Плана счетов
	// а также Статью прочих доходов и расходов для субконто
	СтатьяЗатрат="";
	СчетЗамены=ПолучитьСчетЗамены(СтатьяЗатрат);
	
	// ниже мы поменяем счет, на который делает проводки документ СписаниеТоваров в типовой БП20 (это счет 94)
	// на какой-то свой счет, у которого есть субконто со статьей прочих доходов и расходов
	Если ЗначениеЗаполнено(СчетЗамены) Тогда
		Отбор = Новый Структура;
		Отбор.Вставить("СчетДт",ПланыСчетов.Хозрасчетный.НедостачиИПотериОтПорчиЦенностей);
		МассивСтрок = ТаблицаПроводок.НайтиСтроки(Отбор);
		
		Для Каждого СтрокаТип   Из МассивСтрок Цикл
			// делаем новую проводку (старую потом удалим)
			НоваяСтрока = ТаблицаПроводок.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока,СтрокаТип);
			НоваяСтрока.СчетДт = СчетЗамены;
			НоваяСтрока.ВидСубконтоДт1 = ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ПрочиеДоходыИРасходы;
			НоваяСтрока.СубконтоДт1 = СтатьяЗатрат;

			// удаляем старую проводку
			ТаблицаПроводок.Удалить(СтрокаТип);
		КонецЦикла;
	КонецЕсли;
	
	НаборДвижений.Загрузить(ТаблицаПроводок);
	
КонецПроцедуры

Можно заметить, что в двух процедурах выше немного меняется способ получения набора записей для их редактирования. В первом случае приходится делать отбор по новому набору, так как простое использование Источник.Движения.СебестоимостьТоваров дает следующую ошибку при проведении:

Документ Реализация товаров и услуг А0ТП-000065 от 31.01.2019 12:37:53 не проведен: Попытка использования закрытого менеджера временных таблиц

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

 

2. Изменение движений с помощью дописки в конец процедуры ОбработкаПроведения в Расширении


&После("ОбработкаПроведения")
Процедура Общ_ОбработкаПроведения(Отказ, РежимПроведения)
    Св_ва=УправлениеСвойствами.СвойстваОбъекта(Ссылка, Ложь, Истина);
    Для каждого Св_во из Св_ва Цикл
        Если Св_во.Имя="ПодразделениеКорр._ПРС" Тогда
            ПодрКорр=УправлениеСвойствами.ЗначениеСвойства(Ссылка, Св_во);
            Если ЗначениеЗаполнено(ПодрКорр) Тогда
                Общ_СкорректироватьПроводки(ПодрКорр);
            КонецЕсли; 
            Прервать;
        КонецЕсли; 
    КонецЦикла; 
КонецПроцедуры

Процедура Общ_СкорректироватьПроводки(ПодрКорр)
    Для каждого Движ из Движения.Хозрасчетный Цикл
        Движ.ПодразделениеКт=ПодрКорр;
    КонецЦикла; 
КонецПроцедуры

Пример выше вообще взят из конкретного кейса: необходимо было, если пользователь устанавливал доп. свойство "Подразделение корр." для документа, менять в кредитовой части подразделение (до этой доработки пользователи это делали просто изменяя проводки вручную).

Также можно набор записей выгрузить в таблицу значений, что-то с ней сделать, потом загрузить обратно в набор записей и снова его записать.

 

Ну, и наконец

3. Обработка для изменения движений (вообще, это может быть просто процедура, которая вызывается из регламентного задания или откуда-то еще)

Сама обработка:

Форма обработки

Код в модуле формы:


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

&НаКлиенте
Процедура КорректированиДвижения(Команда)
    КорректированиДвиженияНаСервере(ДокументРТУ);
КонецПроцедуры


Видно, что код очень похож на самый первый пример, где мы отбираем набор записей по Источник.Ссылка

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

В приложенном файле - обработка коррекции движений, полный код которой представлен в статье. Обработка тестировалась на платформе версии 1С:Предприятие 8.3 (8.3.14.1630), конфигурация Управление торговлей, редакция 11 (11.4.6.207).

Вступайте в нашу телеграмм-группу Инфостарт

движения обработка корректировка документ подписка событие удаление движений замена

См. также

Закрытие периода Инструменты администратора БД Корректировка данных Бухгалтер Пользователь 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Расширение «Оперативное проведение» в 4 раза уменьшает время проведения документов и закрытия месяца. Является комплексным решением проблем 62 и 60 счетов. Оптимизирует проведение при включенной функциональной опции «Раздельный учет НДС». Используется в более 10 организациях уже 2 года. Совместимо с конфигурацией Бухгалтерия 3.0 (+КОРП).

14400 руб.

29.04.2020    40740    123    152    

84

Корректировка данных Программист Пользователь 1С:Предприятие 8 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

Представьте, что есть система QR - кодирования, которая НЕ ТРЕБУЕТ изменения конфигурации, НЕ ТРЕБУЕТ изменения ни одной печатной формы для добавления QR-кода, включая внешние, НЕ ХРАНИТ данные штрихкодов и их связь, от чего база не "пухнет", ИМЕЕТ возможность закодировать в QR-коде произвольные данные параметров для последующей обработки полученных данных, УМЕЕТ прикреплять сканы, УМЕЕТ обработать считанный QR-код как ВЫ захотите. А также ХРАНИТ историю операций в обход базы для каждого пользователя в отдельности и УМЕЕТ работать с 2D - сканерами. А также автоматически распознавать отсканированные печатные формы (картинки или pdf-файлы) и выполнять заданные произвольные алгоритмы, в том числе прикрепление их к документам! Обновление 3.3 от 24.06.2025!

26400 руб.

26.08.2018    54625    18    65    

56

Корректировка данных Системный администратор Программист 1С:Предприятие 8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Платные (руб)

Незаменимая обработка для сопровождения конфигураций: ERP, УТ, КА. Позволяет вычистить многие ошибки в ключах аналитики, в ключевых справочниках конфигурации.

3600 руб.

10.02.2017    117429    703    176    

744

Закрытие периода Корректировка данных Программист Пользователь 1С:Предприятие 8 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

Внешняя обработка, позволяющая произвольным образом заполнять документ "Корректировка регистров" Предназначена для использования в конфигурациях "Управление торговлей 11", "Управление небольшой фирмой", "ERP Управление предприятием", а также в других конфигурациях, в состав которых входит библиотека стандартных подсистем (БСП) версии 2.2+ и указанный выше документ.

5000 руб.

13.07.2015    53452    184    29    

136

Ценообразование, анализ цен Корректировка данных 1С:Предприятие 8 1С:Управление торговлей 11 Платные (руб)

Подключаемая внешняя обработка с простой настройкой - позволяет автоматически рассчитывать в документах продажи скидку процентом на каждый второй, третий и т.д. товар с наименьшей ценой из выбранного сегмента. Ничего лишнего для удобного использования!

5000 руб.

07.05.2025    1169    1    0    

2

Загрузка и выгрузка в Excel Корректировка данных Пользователь 1С:Предприятие 8 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Обработка для группового редактирования реквизитов номенклатуры в 1С для УТ 11 / КА 2. Позволяет редактировать реквизиты (как основные, так и дополнительные реквизиты и сведения) непосредственно в таблице, устанавливать новые значения реквизитов на выбранную номенклатуру, а также загружать новые значения из Excel. Предусмотрена возможность добавления фото к товарам перетаскиванием файла из проводника на строку с товаром (drag'n'drop)

4200 руб.

16.11.2020    18928    13    6    

12

Печатные формы Корректировка данных Учет документов 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление нашей фирмой 3.0

Данная обработка позволяет работать со справками об оплате медицинских услуг в любой конфигурации 1С 8.3 Решение выполнено в виде внешней обработки, поэтому будет работать так же на базовых версиях конфигураций 1С, где нет возможности добавить расширение.

3600 руб.

28.01.2025    1655    0    0    

3
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. goliath-itd 29.07.21 16:41 Сейчас в теме
В моем случае имеется закрытый для просмотра модули объекта и менеджера документа. Но требовалось заполнять свой реквизит в регистре накопления. В результате, после срабатывания подписки на событие с обработкой серверным методом, движения возвращались в исходные значения. Использование расширения со своим методом после проведения так же не представлялось возможным.
В результате получилось следующее:
Процедура ПриПроведенииДокументаОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт

	Если Источник.ДавальческаяПрограмма Тогда
		Регистратор = Источник.Ссылка;
		НаборыЗаписей = Источник.Движения;
		НаборЗаписей = НаборыЗаписей.СкладГотовойПродукции;
		Для Каждого Стр Из НаборЗаписей Цикл
			Стр.НомерЗаказа	= Источник.ТЧ1[НаборЗаписей.Индекс(Стр)].Заказ;
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры
Показать


При этом надо понимать, что порядок движений и их количество должны совпадать с количеством записей в табличной части документа.
Для отправки сообщения требуется регистрация/авторизация