Универсальное изменение документов по регистрам без проведения

17.07.26

Задачи пользователя - Подбор и обработка объектов

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

Файлы

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

Наименование Скачано Купить файл
Универсальное изменение документов по регистрам без проведения
.epf 7,58Kb
0 2 500 руб. Купить

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

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

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

Вы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

Суть проблемы: предположим, у некоего произвольного документа поменялся механизм, формирующий проводки по некоторому регистру.

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

Задача: переотразить движения заранее известной выборки документов по заранее известному списку регистров, но НЕ перезаписывая документ. В идеале - не тратя время на анализ того, как конкретно формируются движения документа.

Решение будем рассматривать на базе конфигурации Бухгалтерия Предприятия 3, на примере документа РеализацияТоваровИУслуг. В данном примере поменялся алгоритм проведения по регистру Хозрасчетный. Посмотрим на примере простейшего, косметического изменения в обработчике ПриПроведении (скриншот изменения - ниже) - однако алгоритм не трудно адаптировать под другие регистры, другие документы и даже другие конфигурации.
Замечание: в практике автора изменение алгоритма проведения было сильно сложнее, но к сути статьи это не относится.



Ход решения:

1) Сформируем выборку документов, которые нам надо переотразить. Например, мы хотим переотразить все РТиУ с 2025-го года и далее, движения которых не были откорректированы - ни нашей обработкой, ни вручную.
 

	Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 10 //Можно убрать ""Первые 10"", но на реальной базе это будет работать несколько часов, а обработка демонстрационная.
	                      |	Реализация.Ссылка КАК Ссылка
	                      |ИЗ
	                      |	Документ.РеализацияТоваровУслуг КАК Реализация
	                      |ГДЕ
	                      |	Реализация.Дата >= &Дата
	                      |	И НЕ (ВЫРАЗИТЬ(Реализация.Комментарий КАК СТРОКА(7))) = ""#КорРег""
	                      |	И Реализация.Проведен
	                      |	И НЕ Реализация.РучнаяКорректировка
	                      |
	                      |УПОРЯДОЧИТЬ ПО
	                      |	Реализация.Дата,
	                      |	Реализация.Номер");
	
	Дата = '202501010000'; 
	Запрос.УстановитьПараметр("Дата", Дата);
	
	РезультатЗапроса = Запрос.Выполнить();   
	
	Если РезультатЗапроса.Выгрузить().Количество() = 0 Тогда
		ОбщегоНазначения.СообщитьПользователю("Мы всё переотразили! Ура!"); 
	Иначе
		ОбщегоНазначения.СообщитьПользователю("Обратите внимание - возможно не всё переотражено");
	КонецЕсли;
	
	Выборка = РезультатЗапроса.Выбрать();

Шаг 2: перепроведём каждый отдельный документ, запомнив его движения - и тут же отменим транзакцию, чтобы в результате у нас не было никаких изменений в базе, но был актуальный состав движений по регистрам.

Замечание: поскольку алгоритм универсальный, запоминаются ВСЕ проводки - но если мы заранее знаем, по какому регистру мы хотим выполнить отражение, можно сделать чуть проще, чем в приведённом коде.

КоличествоРегистров = 0;
	
	Пока Выборка.Следующий() Цикл 
		
		Попытка
				
			НовыеТаблицыПроводок = Новый Массив;
			
			ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
			//Это не совсем "групповое перепроведение", но это допсвойство позволит пропустить много "тяжёлых" операций.
			ДокОбъект.ДополнительныеСвойства.Вставить("ГрупповоеПерепроведение", Истина); 
			
			//Создадим новые проводки документа - проще всего это сделать, проведя документ. Потом откатим транзакцию.
			НачатьТранзакцию();   
			ДокОбъект.Записать(РежимЗаписиДокумента.Проведение); 
			Если КоличествоРегистров = 0 Тогда
				КоличествоРегистров = ДокОбъект.Движения.Количество(); 
			КонецЕсли;
			
			Счетчик = 0;
			Пока Счетчик < КоличествоРегистров Цикл 
				НоваяТаблицаПроводок = Новый Структура("Номер, Таблица");
				НоваяТаблицаПроводок.Номер = Счетчик; //Синтакс-помощник не обещает, что при обходе движений документа обход будет упорядочен
				НоваяТаблицаПроводок.Таблица = ДокОбъект.Движения[Счетчик].Выгрузить();
				Счетчик = Счетчик + 1;
				НовыеТаблицыПроводок.Добавить(НоваяТаблицаПроводок);
			КонецЦикла;                                                                                               
			ОтменитьТранзакцию();


3) Обратно превратим сохранённые таблицы значений в готовые к перезаписи наборы записей регистров. В данном конкретном примере, в коллекции движений документа флаг "Записывать" взводится в "Истину" только для хозрасчётного регистра - но если убрать одну проверку, можно перезаписать все проводки документа.

//Заполним коллекцию движений документа
			Для Каждого ТаблицаПроводок Из НовыеТаблицыПроводок Цикл
				ТекущийНабор = ДокОбъект.Движения[ТаблицаПроводок.Номер];
				ТекущийНабор.Прочитать();
				Если ТаблицаПроводок.Таблица.Количество() > 0 //Новая таблица регистров НЕ пустая 
					ИЛИ ТекущийНабор.Количество() > 0 Тогда //Документ имел движения по регистру
					ТекущийНабор.Загрузить(ТаблицаПроводок.Таблица);     
					
					//Если ТекущийНабор = ДокОбъект.Движения.Хозрасчетный - эта проверка ЧИСТО для примера, так как мы знаем, какой конкретно регистр мы поменяли
					Если ТекущийНабор = ДокОбъект.Движения.Хозрасчетный Тогда
						//ТекущийНабор.ОбменДанными.Загрузка = Истина; //ВАЖНО - у регистров тоже могут быть свои подписки на событие при записи и свои обработчики записи.
						ТекущийНабор.Записывать = Истина;                                                                                                            
					КонецЕсли;    
					
				КонецЕсли;
			КонецЦикла;

4) Переотразим конкретные движения, и в режиме обмена данных запишем в документ сообщение о том, что он был откорректирован.
 

			НачатьТранзакцию(); 
			
			ДокОбъект.Движения.Записать(); //Собственно запись движений    
			
			ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
			ДокОбъект.Комментарий = "#КорРег " + ДокОбъект.Комментарий;
			ДокОбъект.ОбменДанными.Загрузка = Истина;
			ДокОбъект.Записать(); //Мы делаем отметку, что мы успешно переотразили документ - это для красоты.			
			ЗафиксироватьТранзакцию();

В случае реальной базы алгоритм может работать несколько часов, но по прошествии этих нескольких часов программист получит переотражённые документы + список тех документов, которые не удалось переотразить (в реальной практике автора успешно отразилось всё на выборке с несколькими тысячами реализаций).

Пример работы обработки (в данном примере в запросе, формирующем выборку документов, установлено "ПЕРВЫЕ 10"):

Шаг 1: поменяли алгоритм отражения РТиУ, но НЕ перепровели документ.

 

 

Шаг 2: запустили обработку - она предупредила, что у нас могут быть не переотражённые документы, переотразила соответствующие документы и сообщила, сколько секунд она работала.

 

Шаг 3) Заходим в документ и видим, что его движения поменялись.

 

 

Замечание 1: поскольку перепроведение документа - "тяжёлая" операция, алгоритм заведомо непроизводителен по сравнению с обработчиком, который корректирует регистры напрямую, без записи документа сперва в режими проведения, а потом в режиме загрузки данных. Смысл обработки не столько в написании быстрого алгоритма, сколько в том, чтобы как можно надёжнее и универсальней гарантировать, что движения по регистру будут переотражены так, словно документ перепровели руками + показать, что такой приём в принципе возможен.

Замечание 2: у алгоритма есть неприятное ограничение - он принципиально неприменим для регистров, которые проводятся отложенно (это встречается, например, для хозрасчётного регистра в ERP).

Замечание 3: использованный трюк подразумевает, что документ можно было переписать и "вручную" - таким образом, нельзя, например, переотразить документы, запрещённые пользователю обработки через дату запрета изменения.

Замечание 4. ВАЖНО: в общем случае, программная обработка события ПриЗаписи может быть не только у документа, но и у набора записей - обратите внимание на модуль набора записей изменяемого регистра, а конкретно - есть ли у него обработчик события ПриЗаписи.

К статье прилагается файл с обработкой и её полный исходный код:
 


&НаСервере
Процедура ОтразитьНаСервереВариантСПроведениемРТУ()  
	
	Начало = ТекущаяДата(); //для удобного "замера производительности"

	Запрос = Новый Запрос("ВЫБРАТЬ ПЕРВЫЕ 10 //Можно убрать ""Первые 10"", но на реальной базе это будет работать несколько часов, а обработка демонстрационная.
	                      |	Реализация.Ссылка КАК Ссылка
	                      |ИЗ
	                      |	Документ.РеализацияТоваровУслуг КАК Реализация
	                      |ГДЕ
	                      |	Реализация.Дата >= &Дата
	                      |	И НЕ (ВЫРАЗИТЬ(Реализация.Комментарий КАК СТРОКА(7))) = ""#КорРег""
	                      |	И Реализация.Проведен
	                      |	И НЕ Реализация.РучнаяКорректировка
	                      |
	                      |УПОРЯДОЧИТЬ ПО
	                      |	Реализация.Дата,
	                      |	Реализация.Номер");
	
	Дата = '202501010000'; 
	Запрос.УстановитьПараметр("Дата", Дата);
	
	РезультатЗапроса = Запрос.Выполнить();   
	
	Если РезультатЗапроса.Выгрузить().Количество() = 0 Тогда
		ОбщегоНазначения.СообщитьПользователю("Мы всё переотразили! Ура!"); 
	Иначе
		ОбщегоНазначения.СообщитьПользователю("Обратите внимание - возможно не всё переотражено");
	КонецЕсли;
	
	Выборка = РезультатЗапроса.Выбрать();
	КоличествоРегистров = 0;
	
	Пока Выборка.Следующий() Цикл 
		
		Попытка
				
			НовыеТаблицыПроводок = Новый Массив;
			
			ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
			//Это не совсем "групповое перепроведение", но это допсвойство позволит пропустить много "тяжёлых" операций.
			ДокОбъект.ДополнительныеСвойства.Вставить("ГрупповоеПерепроведение", Истина); 
			
			//Создадим новые проводки документа - проще всего это сделать, проведя документ. Потом откатим транзакцию.
			НачатьТранзакцию();   
			ДокОбъект.Записать(РежимЗаписиДокумента.Проведение); 
			Если КоличествоРегистров = 0 Тогда
				КоличествоРегистров = ДокОбъект.Движения.Количество(); 
			КонецЕсли;
			
			Счетчик = 0;
			Пока Счетчик < КоличествоРегистров Цикл 
				НоваяТаблицаПроводок = Новый Структура("Номер, Таблица");
				НоваяТаблицаПроводок.Номер = Счетчик; //Синтакс-помощник не обещает, что при обходе движений документа обход будет упорядочен
				НоваяТаблицаПроводок.Таблица = ДокОбъект.Движения[Счетчик].Выгрузить();
				Счетчик = Счетчик + 1;
				НовыеТаблицыПроводок.Добавить(НоваяТаблицаПроводок);
			КонецЦикла;                                                                                               
			ОтменитьТранзакцию();
			
			//Заполним коллекцию движений документа
			Для Каждого ТаблицаПроводок Из НовыеТаблицыПроводок Цикл
				ТекущийНабор = ДокОбъект.Движения[ТаблицаПроводок.Номер];
				ТекущийНабор.Прочитать();
				Если ТаблицаПроводок.Таблица.Количество() > 0 //Новая таблица регистров НЕ пустая 
					ИЛИ ТекущийНабор.Количество() > 0 Тогда //Документ имел движения по регистру
					ТекущийНабор.Загрузить(ТаблицаПроводок.Таблица);     
					
					//Если ТекущийНабор = ДокОбъект.Движения.Хозрасчетный - эта проверка ЧИСТО для примера, так как мы знаем, какой конкретно регистр мы поменяли
					Если ТекущийНабор = ДокОбъект.Движения.Хозрасчетный Тогда 
						//ТекущийНабор.ОбменДанными.Загрузка = Истина; //ВАЖНО - у регистров тоже могут быть свои подписки на событие при записи и свои обработчики записи.
						ТекущийНабор.Записывать = Истина;                                                                                                            
					КонецЕсли;    
					
				КонецЕсли;
			КонецЦикла;
			
			НачатьТранзакцию(); 
			
			ДокОбъект.Движения.Записать(); //Собственно запись движений    
			
			ДокОбъект = Выборка.Ссылка.ПолучитьОбъект();
			ДокОбъект.Комментарий = "#КорРег " + ДокОбъект.Комментарий;
			ДокОбъект.ОбменДанными.Загрузка = Истина;
			ДокОбъект.Записать(); //Мы делаем отметку, что мы успешно переотразили документ - это для красоты.			
			ЗафиксироватьТранзакцию(); 
			
		Исключение        
			ОтменитьТранзакцию();
			Ошибка = ОписаниеОшибки();
			ОбщегоНазначения.СообщитьПользователю(Ошибка);
			ОбщегоНазначения.СообщитьПользователю(СтрШаблон("Были проблемы на документе %1", Выборка.Ссылка), Выборка.Ссылка); 
			ЗаписьЖурналаРегистрации("рои_ПереотражениеДокументов", УровеньЖурналаРегистрации.Ошибка, , Выборка.Ссылка, СтрШаблон("Были проблемы на документе %1 ОШИБКА %2", Выборка.Ссылка, Ошибка));
		КонецПопытки;
	КонецЦикла;   
	
	Конец = ТекущаяДата(); //для удобного "замера производительности"
    Сообщить(Конец - Начало);
	
КонецПроцедуры 

&НаКлиенте
Процедура Отразить(Команда)
	ОтразитьНаСервереВариантСПроведениемРТУ();
КонецПроцедуры

 

Проверено на следующих конфигурациях и релизах:

  • Бухгалтерия предприятия КОРП, редакция 3.0, релизы 3.0.195.40

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

Движения Перепроведение

См. также

Мастера заполнения Поиск данных Инструментарий разработчика Подбор и обработка объектов 1С 8.3 1С 8.5 Платные (руб)

Infostart MagicInput улучшает подбор в полях ввода 1С: ищет по любой части названия и по нескольким ключевым фрагментам, распознаёт ввод в другой раскладке и показывает иконки/статусы объектов прямо в списке. Поддерживает вставку навигационной ссылки/представления документа для автоподбора; для разработчиков доступны поиск по GUID и полному имени предопределённого. Работает в управляемых формах и подключается в большинстве конфигураций 1С 8.3/8.5.

6000 руб.

25.02.2026    4701    16    1    

20

Учетные задачи Поиск данных Подбор и обработка объектов 1С:Предприятие 8 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

1.обработка позволяет автоматически вычислить дубли и привести их к единому наименованию во всех документах. 2.так же есть возможность в документах поменять счета учета для номенклатуры. Например разные бухгалтера оформляют поступление одного и того же товара - один занес на 10.01, второй на 41.01 в результате в ОСВ у нас минусы. В обработке есть возможность наглядно увидеть такие ошибки и тут же их поправить не бегая по всем документам. Достаточно поставить галочку у номенклатуры и указать счет учета который надо найти и счет учета на который надо его заменить. Обработка сама вычислит документы в которых номенклатура с галочкой была задействована и заменит счета учета. Что бы не было излишнего изменения документов, в обработке указываются типы документов, где операция замены счета разрешена (например Поступление ТМЦ, Реализация, Отчет о розничных продажах, возврат покупателю итд.)

7320 руб.

05.06.2026    459    2    0    

4

Подбор и обработка объектов Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 2.0 1С:Бухгалтерия государственного учреждения 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Данная обработка предлагается для случаев, когда бывает необходимо изменить какой-либо реквизит в группе проводок, отобранных по определенному набору полей, за определенный период, с определенным типом документа-регистратора. Предлагается четыре варианта обработки для конфигураций: БП 2.0, БП 3.0, БГУ 1.0, БГУ 2.0.

2400 руб.

30.05.2016    30487    32    1    

52

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

Обработка «Сравнение документов» — это мощный инструмент для синхронизации и контроля данных между базами 1С:УНФ – 1С:БП, 1С:УТ – 1С:БП. Она позволяет сравнивать документы в двух базах, выявлять расхождения и загружать недостающие документы из одной базы в другую.

12200 руб.

06.08.2025    2538    4    0    

5

Подбор и обработка объектов Программист Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 Абонемент ($m)

Данная обработка может быть полезна тем, кто хочет сделать более точечную замену объектов, когда заказчику необходимо заменить что-то только в определенном виде документа (справочника) с определенным отбором по реквизитам.

1 стартмани

09.05.2025    3435    95    Rafael-87    18    

7

Поиск данных ЭДО и ОФД Подбор и обработка объектов 1С:Предприятие 8 1С:Управление нашей фирмой 3.0 Россия Платные (руб)

Поиск номенклатуры при сопоставлении в ЭДО не интуитивный, не настраиваемый и просто неудобный. Данное решение - это альтернативный вариант расширенного поиска и сопоставления номенклатуры для 1С, который подключается в качестве расширения и решает эту проблему.

10000 руб.

10.04.2025    2591    1    1    

2

Зарплата Подбор и обработка объектов Бухгалтер 1С:Предприятие 8 1С:Управление производственным предприятием Россия Бухгалтерский учет НДФЛ Абонемент ($m)

Обработка позволяет выполнить последовательное (по датам получения дохода) распроведение и проведение документов по НДФЛ в конфигурации УПП 1.3.

1 стартмани

17.02.2025    4725    74    alexbur    19    

4

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

Журнал содержит все созданные документы в конфигурации. Позволяет выполнять стандартные действия с документами (создание, удаление, проведение), устанавливать отбор по видам документов, реквизитам документов, распечатывать печатные формы, формировать печатный реестр отобранных документов, выполнять групповые обработки, а также сохранять варианты журналов с выборочными наборами документов. Работает в т.ч. с базовыми версиями 1с.

10 стартмани

07.02.2025    8259    103    Marat1c8    52    

10
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Светлый ум 507 17.07.26 14:21 Сейчас в теме
В журнале регистрации пишите об измнении?
2. VKuser233196182 1 17.07.26 14:42 Сейчас в теме
(1) Только если были ошибки, в случае успешного изменения - не пишу. Смысла особого нет, я там в сам документ комментарий дописываю - чтобы это изменение можно было отловить глазами или простым запросом к базе данных.

ДокОбъект.Комментарий = "#КорРег " + ДокОбъект.Комментарий;
Для отправки сообщения требуется регистрация/авторизация