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

26.05.19

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Корректировка движений документа:
.epf 6,67Kb
12
12 Скачать (1 SM) Купить за 1 850 руб.

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

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

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

  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    32666    106    152    

73

SALE! 20%

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

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

3600 2880 руб.

10.02.2017    110498    662    174    

702

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

Закрытие месяца - важный процесс в современных конфигурациях, таких как УТ 11.4, УТ 11.5, КА 2.4, КА 2.5 ERP 2.4,ERP 2.5, КА 2 Казахстан, УТ 3 Казахстан регламентные операции влияют на расчет себестоимости, и ошибки в данном расчете не дают картины деятельности организации.

4800 руб.

27.10.2021    23918    241    35    

78

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

Обработка предназначена для корректировки входящего НДС при смене системы налогообложения индивидуального предпринимателя с УСН на ОСНО в 1С:Бухгалтерия предприятия 3.0

4000 руб.

18.07.2024    688    1    0    

1

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

Внешняя обработка предназначена для исправления самых различных ошибок, возникших по самым разным причинам. Общее проявление этих ошибок видно в различии данных между: проводками и различными отчетами по НДФЛ, заполнении ведомостей на выдачу зарплаты, неверным расчетом НДФЛ при начислении ЗП и т.д.

3600 руб.

09.02.2024    1680    11    5    

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

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

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


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