gifts2017

Сдвиг даты контроля последовательности проведения документов в БП 3.0

Опубликовал e401 (e401) в раздел Обработки - Обработка документов

Обработка для контроля и сдвига даты контроля последовательности проведения документов в БП 3.0 при необходимости

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

1. По кнопке "Анализ последовательности" выводит таблицу документов с нарушением последовательности проведения с указанием даты и времени.

2. Позволяет выбрать организацию для анализа последовательности.

3. Предлагает три варианта исправления нарушения последовательности:

- поправить состояние первого в таблице "документа-нарушителя";

- поправить несколько документов до требуемой даты;

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

4. Обработка работоспособна в обычном интерфейсе и в Такси.

5. Фактически обработка в наборе записей последовательности меняет статус движения документа с "ПроведенСНарушениемПоследовательности" на "ПроведенВПоследовательности".

Использовать обработку надо очень осторожно и "с умом". Обязательно надо понимать, когда можно ее применять, а когда нельзя и к чему могут привести такие исправления.

Сам пользуюсь ею уже с полгода: бухгалтерам иногда требуется что-то исправить в закрытых периодах. У нас БП 3.0.37.41. Учет по средней. Используем обычный интерфейс.

Прошу критических замечаний от спецов, к каковым себя не отношу.

За возможные кусочки плагиата кода или идеи прошу сильно не ругать.

Скачать файлы

Наименование Файл Версия Размер
СдвигДатыКонтроляПоследовательности_upd1.epf 10
.epf 10,33Kb
28.04.16
10
.epf 10,33Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Роман Кусков (romku) 27.04.15 21:29
В БП 3.0.39.57 нет процедуры РаботаСПоследовательностями.УстановитьПоследовательность(
Может удалили? Поделитесь пож-та.
2. e401 (e401) 28.04.15 19:27
(1) romku, Вам нужна сама функция?
Вроде как вот она
// Устанавливает состояние "Проведен в последовательности" для всех записей 
// последовательности за указанный период. 
//
// Параметры:
// 	Организация 	- СправочникСсылка.Организации, по которой меняется последовательность.
//	ДатаНачала 		- Дата начала периода. Если указана пустая дата, то самого начала последовательности.
// 	ДатаОкончания	- Дата окончания периода, за который необходимо установить состояние последовательности.
//
// Возвращаемое значение:
//	Момент времени, на который фактически была установлена последовательность.
//
Функция УстановитьПоследовательность(Организация, ДатаНачала, ДатаОкончания) Экспорт

	МоментСледующегоДокумента = Неопределено;
	
	// Для изменения состояний в последовательности блокируем последовательность
	// в целом по организации. 
	// Установка управляемой блокировки возможно только в рамках транзакции.
	// В случае возникновения ошибок отменяем транзакцию.
	
	НачатьТранзакцию();

	Попытка 

		УстановитьБлокировкуПоследовательностиПоОрганизации(Организация);

		Запрос = Новый Запрос;
		Запрос.УстановитьПараметр("Организация", 	Организация);
		Запрос.УстановитьПараметр("ДатаНачала", 	ДатаНачала);
		Запрос.УстановитьПараметр("ДатаОкончания", 	ДатаОкончания);

		Запрос.Текст = 
		"ВЫБРАТЬ РАЗЛИЧНЫЕ
		|	ТаблицаПоследовательности.Регистратор
		|ИЗ
		|	Последовательность.ДокументыОрганизаций КАК ТаблицаПоследовательности
		|ГДЕ
		|	ТаблицаПоследовательности.Организация = &Организация
		|	И &УсловиеПериод
		|	И ТаблицаПоследовательности.СостояниеПроведения В (ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ПроведенСНарушениемПоследовательности), ЗНАЧЕНИЕ(Перечисление.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности))";
		
		ТекстУсловиеПериод = "";
		Если ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ДатаОкончания) Тогда
			ТекстУсловиеПериод = "ТаблицаПоследовательности.Период МЕЖДУ &ДатаНачала И &ДатаОкончания";
		ИначеЕсли ЗначениеЗаполнено(ДатаНачала) Тогда
			ТекстУсловиеПериод = "ТаблицаПоследовательности.Период >= &ДатаНачала";
		ИначеЕсли ЗначениеЗаполнено(ДатаОкончания) Тогда
			ТекстУсловиеПериод = "ТаблицаПоследовательности.Период <= &ДатаОкончания";
		КонецЕсли;
		
		Если ЗначениеЗаполнено(ТекстУсловиеПериод) Тогда
			Запрос.Текст = СтрЗаменить(Запрос.Текст, "&УсловиеПериод", ТекстУсловиеПериод);
		Иначе
			Запрос.Текст = СтрЗаменить(Запрос.Текст, "И &УсловиеПериод", "");
		КонецЕсли;
		
		Выборка = Запрос.Выполнить().Выбрать();
		
		НаборЗаписей = Последовательности.ДокументыОрганизаций.СоздатьНаборЗаписей();
		
		Пока Выборка.Следующий() Цикл
		
			НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор);
			НаборЗаписей.Прочитать();
			
			ВГраница = НаборЗаписей.Количество() - 1;
			
			Для Сч = 0 По ВГраница Цикл
				// Удаляем с конца набора
				Движение = НаборЗаписей[ВГраница - Сч];
				
				// У документа могут быть записи последовательности по нескольким организациям,
				// если у него ранее меняли реквизит Организация, поэтому обрабатываем
				// только записи по текущей организации.
				Если Движение.Организация = Организация Тогда
				
					Если Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ИсключенИзПоследовательности Тогда
						НаборЗаписей.Удалить(Движение);
					Иначе
						Движение.СостояниеПроведения = Перечисления.СостоянияПроведенияВПоследовательности.ПроведенВПоследовательности;
					КонецЕсли;
				
				КонецЕсли;
			
			КонецЦикла;
			
			НаборЗаписей.Записать();
		
		КонецЦикла;
		
		Если ЗначениеЗаполнено(ДатаОкончания) Тогда
		
			// Следующий по очереди документ объявляем проведенным с нарушением, 
			// чтобы с него начать потом перепроведение.
			МоментСледующегоДокумента = МоментВремениПервогоДокументаВПоследовательности(Организация, ДатаОкончания + 1);
			
			Если МоментСледующегоДокумента <> Неопределено Тогда
			
				СброситьСостояниеПоследовательностиДокумента(
					МоментСледующегоДокумента.Ссылка, 
					МоментСледующегоДокумента.Дата,
					Организация);
				
			КонецЕсли;
		
		КонецЕсли;
		
		ЗафиксироватьТранзакцию();
	
	Исключение
	
		ТекстОшибки = ОписаниеОшибки();
		ОписаниеОшибки = ИнформацияОбОшибке();
	
		ОтменитьТранзакцию();
		
		ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстОшибки);
		ЗаписьЖурналаРегистрации(НСтр("ru = 'Операция не выполнена'"), УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки.Описание);
		ВызватьИсключение ТекстОшибки;
	
	КонецПопытки;
		
	Возврат МоментСледующегоДокумента;
	
КонецФункции
...Показать Скрыть
3. sbv2005 (sbv2005) 17.07.15 12:43
Хорошая обработка. Спасибо!
4. юрий гулидов (gull22) 26.10.15 09:11
Спасибо за обработку, пользовался. Обновили платформу и релиз. Попытался воспользоваться 2-м методом(по дате),выдана ошибка:
{Форма.Форма.Форма(108)}: Метод объекта не обнаружен (УстановитьПоследовательность)
РаботаСПоследовательностями.УстановитьПоследовательность(Организация,ДатаНарушенияПоследовательности,КонецДня(НоваяДатаКонтроляПоследовательности));

Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.42.46) 1С:Предприятие 8.3 (8.3.6.2332)
5. e401 (e401) 26.10.15 14:57
(4) gull22,
Добрый день, Юрий!
Спасибо за замечание. Да, действительно, перестал работать второй вариант, т.к. разработчики убрали из общего модуля РаботаСПоследовательностями функцию УстановитьПоследовательность(...), которую я здесь использовал.
Подправил, добавив копию этой функции в модуль формы самой обработки. Выложил новую версию.
Юрий, а куда можно Вам выслать обновленную версию обработки?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа