Метод формирования движений в типовых регистрах нетиповыми регистраторами

Программирование - Практика программирования

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").
Обновление от 12.12.2017

1. Учтя замечания к публикации, принял решение добавить раздел содержащий примеры обработчиков подписок, событиями запуска которых являются "ОбработкаПолученияПредставления" и "ОбработкаПолученияФормы".

2. Изменены используемые имена "ПроводимыйДокумент"->"ИсходныйДокумент", "КорректировкаЗаписейРегистров" -> "КорректировкаРегистров", "СоответствиеДокументовСКорректировкойЗаписейРегистров" -> "СоответствиеДокументовСКорректировкойРегистров".

3. Обработка ошибок реализована с помощью использования актуальной версии БСП. Не думаю, что возникнут особые трудности, в случае необходимости, изменить данный код под собственные требования.

4. Добавлен комментарий во фрагменте текста по организации связи между документами.

5. Добавлен пример вызова отчета "ДвиженияДокумента" из формы исходного документа для современных конфигураций.

В целом, данное обновление публикации можно характеризовать необходимостью расширить описание приведенного метода в сторону управляемого приложения. При этом, на текущий момент, приведенная исходная задача все еще имеет отношение к УПП 1.3.


 

Как, вероятно, уже стало понятно из краткого описания, требуемые движения будет создавать документ "Корректировка регистров" или его аналог в устаревающих конфигурациях "Корректировка записей регистров". Эти документы равнозначны по своему принципу работы и имеют различия лишь в наименовании и составе доступных для проведения регистров. Далее буду приводить примеры с упоминанием  "Корректировка регистров" не смотря на то, что исходную задачу приходилось решать в рамках конфигурации УПП 1.3. Примечателен этот документ тем, что может является регистратором для всех типовых подчиненных регистров(а также нетиповых, если об этом позаботился разработчик). В качестве примера приведу следующую задачу:

В конфигурации "Управление производственным предприятием 1.3" необходимо добавить документ "Инвентаризация тары". В шапке документа имеются сведения о поставщике и покупателе. В единственной табличной части находятся сведения о номенклатуре и ее количестве. При проведении документ делает расход по регистрам "Товары переданные" и "Товары полученные".

Вообще-то наш документ может быть типовым, но не "умеющим" проводится по некоторым регистрам как нам бы хотелось. Идея в общем случае проста: добавить несколько подписок на события, регистр связи объектов и описать необходимые движения.

Ключевым моментом является организация связи между нашим новым документом ("Инвентаризация тары") и действительным регистратором движений ("Корректировка регистров"). Создадим независимый непериодический регистр "СоответствиеДокументовСКорректировкойРегистров"(для именования своих объектов я использую формат ("дд_" + Наименование), поэтому в коде будет встречаться имя регистра, а так же других метаданных с префиксом). Измерениями будут являться: ИсходныйДокумент(тип ДокументСсылка) и КорректировкаРегистров(тип ДокументСсылка.КорректировкаРегистров). Добавим единственный ресурс с типом "Дата и время", где мы будем указывать, когда была установлена связь между проводимым документом и регистратором. 

Для управляемого приложения в рамках которого можно а) разрабатывать расширения с добавлением собственных реквизитов в типовые объекты и б) использовать обработку получения представления, вероятно, оптимальнее будет не использовать дополнительный регистр, а добавить в расширение документа "КорректировкаРегистров" реквизит "ИсходныйДокумент"(тип ДокументСсылка) и в дальнейшем его использовать в качестве связи. Тяжесть принятия решения о ее реализации, я оставляю разработчику. Однако, далее продолжу приводить код с упоминанием именно регистра сведений "СоответствиеДокументовСКорректировкойРегистров", т.к. его использование универсально.

1. Допустим "Инвентаризация тары" разрешено проводить. Добавим подписку  для события "ОбработкаПроведения". Я обычно указываю в качестве источника сразу же весь вид метаданных, связанных с событием,и уже дальше в обработчике описываю условия исполнения кода для того или иного конкретного типа. В данном случае процедура имеет следующий вид(здесь и далее фрагменты кода находятся под катом): 

1.1 При проведении исходного документа
Процедура дд_ОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт

	Если Отказ ИЛИ Источник.ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	Если ТипЗнч(Источник) = Тип("ДокументОбъект.дд_ИнвентаризацияТары") Тогда

		СсылкаНаОбъект = Источник.Ссылка; 

		//Создадим объект-заготовку на случай отсутствия имеющегося связанного документа-корректировки
		ОбъектДокумент = Документы.КорректировкаРегистров.СоздатьДокумент();

		//Попытаемся прочитать сведения о имеющейся связи
		НаборЗаписей = РегистрыСведений.дд_СоответствиеДокументовСКорректировкойРегистров.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.ИсходныйДокумент.Установить(СсылкаНаОбъект);
		НаборЗаписей.Прочитать();

		//При отсутствии связи мы ее установим при этом укажем ссылку на еще не записанный документ-корректировку
		Если НаборЗаписей.Количество() = 0 Тогда
			Движение = НаборЗаписей.Добавить();
			Движение.Период = ТекущаяДата();
			Движение.ИсходныйДокумент = СсылкаНаОбъект;

			//Многим известная функция получения ссылки даже если объект еще не был записан.
			//Ее текст приведен отдельно ниже
			СсылкаНаОбъект = ПолучитьСсылкуИзОбъекта(ОбъектДокумент);
			Движение.КорректировкаРегистров = СсылкаНаОбъект;
			НаборЗаписей.Записать();
		Иначе

			//Если соответствие уже есть, то просто получаем текущий документ для дальнейшего редактирования
			ОбъектДокумент = НаборЗаписей.Получить(0).КорректировкаРегистров.ПолучитьОбъект();
		КонецЕсли;

		//Основная магия начинается тут!
		ОбъектДокумент.Записать();

	КонецЕсли;

КонецПроцедуры
1.2 Получение ссылки из объекта
Функция ПолучитьСсылкуИзОбъекта(Объект)

	Если Объект.ЭтоНовый() Тогда

		// Получаем возможно уже установленную ранее ссылку нового
		СсылкаНаОбъект = Объект.ПолучитьСсылкуНового();
		Если НЕ ЗначениеЗаполнено(СсылкаНаОбъект) Тогда

			// Если ссылка нового пустая, то запрашиваем ее у менеджера и устанавливаем
			МенеджерОбъекта = ОбщегоНазначения.МенеджерОбъектаПоСсылке(СсылкаНаОбъект);
			СсылкаНаОбъект = МенеджерОбъекта.ПолучитьСсылку();
			Объект.УстановитьСсылкуНового(СсылкаНаОбъект);

		КонецЕсли;
	Иначе

		СсылкаНаОбъект = Объект.Ссылка;

	КонецЕсли;

	Возврат СсылкаНаОбъект;

КонецФункции

 

2. Теперь перейдем к документу "Корректировка регистров". Нам известно, что ему запрещено проводится, т.е. движения с ним связанные будут записаны в базу при записи самого документа. Для обеспечения каскадной связи с "ИнвентариазцияТары" добавим подписку, где источником будет ДокументОбъект и событие "ПередЗаписью". В обработчике этой подписки мы будем управлять движениями нашей корректировки.

2.1 Перед записью документа регистратора
Процедура дд_ПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

	Перем Ошибки;

	Если Отказ ИЛИ Источник.ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	Если ТипЗнч(Источник) = Тип("ДокументОбъект.КорректировкаРегистров") Тогда

		//Ранее уже описанная функция получения ссылки
		СсылкаНаОбъект = ПолучитьСсылкуИзОбъекта(Источник);

		//Функция получения связанных исходных документов из движений регистра соответствия
		//Ее код будет приведен ниже.
		СвязанныйДокумент = ПолучитьСвязанныйСКорректировкойДокумент(СсылкаНаОбъект);
		Если СвязанныйДокумент = Неопределено Тогда
			Возврат;
		КонецЕсли;

		//Проверим не установил ли пользователь пометку удаления
		Если Источник.ПометкаУдаления И СвязанныйДокумент.Проведен Тогда

			//В типовой процедуре модуля объекта содержится код отменяющий активность движений при ПометкаУдаления = Истина
			//Приведенная процедура возвращает активность движений. Ее код будет приведен ниже
			УстановитьАктивностьДвижений(СсылкаНаОбъект,Истина);
			ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,,"Удаление не может быть произведено, тк имеется проведенный, связанный документ " + СокрЛП(СвязанныйДокумент.ИсходныйДокумент) + ".",);
			ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ);

		КонецЕсли;

		//Если найден связанный документ и он проведен
		Если НЕ Источник.ПометкаУдаления И СвязанныйДокумент.Проведен Тогда

			Для каждого Набор Из Источник.Движения Цикл
				Если Набор.Количество() = 0 Тогда
					Продолжить;
				КонецЕсли;
				Набор.Очистить();
			КонецЦикла;

			КорректировкаРегистров = Метаданные.Документы.Найти("КорректировкаРегистров");
			Если КорректировкаРегистров <> Неопределено Тогда
				Источник["ТаблицаРегистров"].Очистить();
			Иначе
				Источник["ТаблицаРегистровБухгалтерии"].Очистить();
				Источник["ТаблицаРегистровНакопления"].Очистить();
				Источник["ТаблицаРегистровСведений"].Очистить();
				Источник["ЗаполнениеДвижений"].Очистить();
				Источник["ИспользоватьЗаполнениеДвижений"] = Ложь;				
			КонецЕсли;

			Источник.ПометкаУдаления = Ложь;
			Источник.Дата = СвязанныйДокумент.ИсходныйДокумент.Дата;

			//Делаем пометку для любопытных пользователей
			Источник.Комментарий = "Создана автоматически для " + СокрЛП(СвязанныйДокумент.ИсходныйДокумент) + ". Не пытайтесь изменить эту корректировку из ее формы.";
			Источник.Ответственный = "";

			//ТУТ УКАЗЫВАЕТСЯ КОД ФОРМИРОВАНИЯ ДВИЖЕНИЙ
			//приведу следующий не хитрый фрагмент в качестве примера
			//и заранее закомментирую на всякий случай
			//Attention! Указанные регистры существуют только в УПП!
			#Область ФормированиеДвижений
			//НаборЗаписейТоварыПринятые = РегистрыНакопления. ТоварыПринятые. СоздатьНаборЗаписей() ;
			//НаборЗаписей. Отбор. Регистратор. Установить(СсылкаНаОбъект) ;
			//НаборЗаписейТоварыПереданные = РегистрыНакопления. ТоварыПереданные. СоздатьНаборЗаписей() ;
			//НаборЗаписейТоварыПереданные. Отбор. Регистратор. Установить(СсылкаНаОбъект) ;
			//Для Каждого ТекСтрока Из Тара Цикл
			// Движение = НаборЗаписейТоварыПринятые. ДобавитьРасход() ;
			// Движение. Период = СсылкаНаОбъект. Дата;
			// Движение. Номенклатура = ТекСтрока. Номенклатура;
			// Движение. Характеристика = ТекСтрока. ХарактеристикаНоменклатуры;
			// Движение. Количество = ТекСтрока. Количество;
			// Движение = НаборЗаписейТоварыПереданные. ДобавитьРасход() ;
			// Движение. Период = СсылкаНаОбъект. Дата;
			// Движение. Номенклатура = ТекСтрока. Номенклатура;
			// Движение. Характеристика = ТекСтрока. ХарактеристикаНоменклатуры;
			// Движение. Количество = ТекСтрока. Количество;
			//КонецЦикла;
			//НаборЗаписейТоварыПринятые. Записать() ;
			//НаборЗаписейТоварыПереданные. Записать() ;
			#КонецОбласти
			//ТУТ УКАЗЫВАЕТСЯ КОД ФОРМИРОВАНИЯ ДВИЖЕНИЙ
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры
2.2 Функция получения связанных с регистратором исходного документа
Функция ПолучитьСвязанныйСКорректировкойДокумент(КорректировкаРегистров)Экспорт

	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("КорректировкаРегистров", КорректировкаРегистров);
	Запрос.Текст =
	"ВЫБРАТЬ ПЕРВЫЕ 1
	| дд_СоответствиеДокументовСКорректировкойРегистров.ИсходныйДокумент КАК ИсходныйДокумент,
	| дд_СоответствиеДокументовСКорректировкойРегистров.ИсходныйДокумент.Проведен КАК Проведен
	|ИЗ
	| РегистрСведений.дд_СоответствиеДокументовСКорректировкойРегистров КАК дд_СоответствиеДокументовСКорректировкойРегистров
	|ГДЕ
	| дд_СоответствиеДокументовСКорректировкойРегистров.КорректировкаРегистров = &КорректировкаРегистров";
	Результат = Запрос.Выполнить();
	Если Результат.Пустой() Тогда
		Возврат Неопределено
	КонецЕсли;

	Выборка = Результат.Выбрать();
	Выборка.Следующий();

	Возврат Новый Структура("ИсходныйДокумент,Проведен",Выборка.ИсходныйДокумент,Выборка.Проведен);

КонецФункции
2.3 Установка активности движений регистратора
Процедура УстановитьАктивностьДвижений(Источник,ФлагАктивности) Экспорт

	Движения = Источник.Движения;
	Для Каждого Движение Из Движения Цикл
		Движение.Прочитать();	
		Движение.УстановитьАктивность(ФлагАктивности);	
	КонецЦикла;

КонецПроцедуры

 

Этого кода достаточно для следующих ситуаций:

 1. проведение исходного документа, т.е. получение требуемых движений 

 2. "защита" регистратора "Корректировка регистров" от перезаписи, например установки пометки удаления.

В итоге, при проведении "ИнвентариазцияТары" будет создан документ, выглядящий достаточно мало заполненным(но более и не требуется), следующего вида:

Потребуется реализовать обработки для:

 3. "защита" регистратора "Корректировка регистров" от удаления на случай, если кому то придет в голову "снести"  наш документ.

 4. распроведение исходного документа

 

Осталось совсем немного.

3. Добавим подписку для события "ПередУдалением". Тут все просто:

3.1 Перед удалением регистратора
Процедура дд_ПередУдалениемДокумента(Источник, Отказ) Экспорт

	Перем Ошибки;

	Если Отказ ИЛИ Источник.ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	Если ТипЗнч(Источник) = Тип("ДокументОбъект.КорректировкаРегистров") Тогда

		СвязанныйДокумент = ПолучитьСвязанныйСКорректировкойДокумент(Источник.Ссылка);

		Если СвязанныйДокумент <> Неопределено И
			СвязанныйДокумент.Проведен Тогда		
			ОбщегоНазначенияКлиентСервер.ДобавитьОшибкуПользователю(Ошибки,,"Удаление не может быть произведено, тк имеется проведенный, связанный документ " + СокрЛП(СвязанныйДокумент.ИсходныйДокумент) + ".",);
			ОбщегоНазначенияКлиентСервер.СообщитьОшибкиПользователю(Ошибки, Отказ);
		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

 

4. Добавим подписку для события "ОбработкаУдаленияПроведения", где источником будет все тот же "ДокументОбъект" , а в обработчике следующий код:

4.1 Отмена проведения исходного документа
Процедура дд_УдалениеПроведенияОбработка(Источник, Отказ) Экспорт

	Перем Ошибки;

	Если Отказ ИЛИ Источник.ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

	Если ТипЗнч(Источник) = Тип("ДокументОбъект.дд_ИнвентаризацияТары") Тогда

		ИсточникСсылка = Источник.Ссылка;

		НаборЗаписей = РегистрыСведений.дд_СоответствиеДокументовСКорректировкойРегистров.СоздатьНаборЗаписей();
		НаборЗаписей.Отбор.ИсходныйДокумент.Установить(ИсточникСсылка);
		НаборЗаписей.Прочитать();

		Если НаборЗаписей.Количество()> 0 Тогда

			//Удаляем связь
			Движение = НаборЗаписей.Получить(0);
			ОбъектКорректировка = Движение.КорректировкаРегистров.ПолучитьОбъект();
			Период = Движение.Период;
			НаборЗаписей.Очистить();
			НаборЗаписей.Записать();

			//Пытаемся удалить связь. Если по каким то причинам нам это не удается, тогда
			//восстанавливаем связь и вызываем отказ распроведения документа
			Попытка
				ОбъектКорректировка.Удалить();
			Исключение

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

			КонецПопытки;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

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

Всё! Таким образом реализованный механизм формирования движений вписывается в типовой функционал большинства конфигураций. Для устаревающих программных продуктов надо лишь заменить "КорректировкаРегистров" на "КорректировкаЗаписейРегистров" и поправить фрагменты связанные с выводом сообщений об ошибках.

 

P.S Показать движения регистратора из формы исходного документа

Я не забыл о пользователях, которые слышали про регистры, движения и ими интересуются. И вывел для них кнопочки в нужных местах с обработчиком:

Обычное приложение
Процедура ДействияФормыДвиженияДокументаПоРегистрам(Кнопка)
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("ПроводимыйДокумент", Ссылка);
	Запрос.Текст = 
	"ВЫБРАТЬ ПЕРВЫЕ 1
	|	ТТР_СоответствиеДокументовСКорректировкойЗаписейРегистров.КорректировкаЗаписейРегистров
	|ИЗ
	|	РегистрСведений.ТТР_СоответствиеДокументовСКорректировкойЗаписейРегистров КАК ТТР_СоответствиеДокументовСКорректировкойЗаписейРегистров
    |ГДЕ
    |   ПроводимыйДокумент = &ПроводимыйДокумент)";
	
	Результат = Запрос.Выполнить();

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

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

&НаКлиенте
Процедура ДвиженияДокумента(Команда)
	
	ОткрытьФорму("Отчет.ДвиженияДокумента.Форма", 
	Новый Структура("Документ", ПолучитьСсылкуНаДействительныйРегистратор(Элементы.Список.ТекущаяСтрока)),
	ЭтаФорма,
	ЭтаФорма.УникальныйИдентификатор,
	ЭтаФорма.Окно);

КонецПроцедуры

 

P.S.S Подписки на события "ОбработкаПолученияПредставления" и "ОбработкаПолученияФормы"

В зависимости от преследуемых целей(запутать или открыть правду пользователям), в конфигурациях не имеющих совместимости с 8.2 у разработчика есть возможность манипулировать внешним видом документа "КорректировкаРегистров", а именно представлением и формой. Необходимо добавить лишь две подписки на события обработчиками соответствующие им:

Процедура дд_ОбработкаПолученияПредставленияДокумента(Источник, Данные, Представление, СтандартнаяОбработка) Экспорт

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

			Представление = Прав(Лев(КомментарийДокумента,ДлиннаКомментария-ДлинаВторойЧастиКомментария),ВтораяЧастьКомментария-ДлинаПервойЧастиКомментария);

			СтандартнаяОбработка = Ложь;
			
		КонецЕсли;
	КонецЕсли;
	
КонецПроцедуры
Процедура дд_ОбработкаПолученияФормыДокумента(Источник, ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Экспорт
	
	Если ТипЗнч(Источник) = Тип("ДокументМенеджер.КорректировкаРегистров") Тогда

		Если ВидФормы = "ФормаОбъекта" Тогда

			Если  НЕ Параметры.Ключ.Пустая() Тогда

				НаборЗаписей = РегистрыСведений.дд_СоответствиеДокументовСКорректировкойРегистров.СоздатьНаборЗаписей();
				НаборЗаписей.Отбор.КорректировкаРегистров.Установить(Параметры.Ключ);
				НаборЗаписей.Прочитать();
				
				Если НаборЗаписей.Количество() > 0 Тогда

					Параметры.Ключ = НаборЗаписей.Получить(0).ИсходныйДокумент;
					ИмяТипаДокумента = СокрЛП(ТипЗнч(Параметры.Ключ));

					ВыбраннаяФорма = "Документ." + ИмяТипаДокумента + ".ФормаОбъекта";

					СтандартнаяОбработка = Ложь;

				КонецЕсли; 
				
			КонецЕсли; 

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

 

 

См. также

Комментарии
1. Анатолий Ситников (acsent) 1044 05.12.17 18:19 Сейчас в теме
отчеты с разворотом до регистратора будут совсем не удобны
2. Андрей Аввакумов (itriot11) 16 05.12.17 18:34 Сейчас в теме
(1) ну это же можно решить сделав небольшой допил необходимых отчетов.
6. Денис Харченко (nomadon) 169 06.12.17 14:16 Сейчас в теме
(1) с помощью (4) решается) делается обработка представления, и подменяется открываемая форма корректировки
7. Андрей Аввакумов (itriot11) 16 06.12.17 15:38 Сейчас в теме
(6) увы, такие подписки будут действовать только для конфигураций без поддержи совместимости с 8.2. Однако, я думаю, что включу в публикацию примеры реализации решения этих вопросов для баз на 8.3 .
3. Анатолий (aka Любитель XML) 05.12.17 18:39 Сейчас в теме
В целом не плохо, плюсанул, возможно прикручу где-нибудь
4. Денис Харченко (nomadon) 169 06.12.17 07:54 Сейчас в теме
А где упоминание об обработке представления корркктировки?
5. Андрей Аввакумов (itriot11) 16 06.12.17 11:23 Сейчас в теме
(4) Добавлю чуть позже, спасибо.
8. Коля Ипатов (Bazil) 224 06.12.17 16:05 Сейчас в теме
Решение оригинальное. Но мне кажется, задача "не затереть тип регистратора в регистре" не такая сложная. Простые тесты, памятка для обновляльщика легко её решают. Решая несложную задачу, вы порождаете большее количество сложностей. Вроде как облегчилось обновление, но для работы расшифровок по регистраторам надо будет переписать кучу типовых отчетов, а это приводит наоборот, к усложнению (я в курсе про переопределение представления, но оно возможно только на 8.3 без режима совместимости с 8.2). А еще, например, есть обработки, которые дописывают движения в существующие документы, типа восстановление расчетов, и их тоже придется пилить.
roofless; Tavalik; Сурикат; +3 Ответить
9. Андрей Аввакумов (itriot11) 16 06.12.17 17:07 Сейчас в теме
(8)
Вопрос сложности имеет место быть. Каким образом я для себя принял решение в рамках задачи приведенной в примере:
- уже имею готовый алгоритм обхода модификации регистра
- не горю желанием помнить лишний раз про типы регистраторов
- меня тревожит вероятность допустить ошибку при обновлении(не смотря на тесты и бэкапы)
- пользователи допускают в отчетах видеть в качестве регистраторов таких движений документ "Корректировка записей регистров".
- пользователей желающих видеть в качестве представления исходный документ не нашлось
- специфические обработки не используется
Вангую, если бы возникли пользователи захотевшие увидеть исходный документ, то речь шла об 1-2 формах отчетов/списков, а не о куче, и считаю, что это для меня было бы не трудно реализовать.
Таким образом, взвесив аргументы, принял решение, что описанным методом приведенную мной задачу решить не сложно. При этом, конечно, не отрицаю, что данный вариант имеет свои минусы и в определенных ситуациях они могут быть крайне весомыми.
10. Сергей Иванов (u_n_k_n_o_w_n) 21 07.12.17 11:21 Сейчас в теме
(9) , тесты как раз и решают Вашу головную боль. В приведенном примере как раз "ярко" описывается пример, когда "вроде бы" не надо даже тестировать конфигурацию.
15. Эльдар Гамзаев (lunjio) 43 14.12.17 12:46 Сейчас в теме
По поводу расшифровки, и с учетом того, что это будет работать на 8.3, можно при получении представления по корректировке записей регистров выдавать представление связанного документа, а при открытии форму, открывать форму связанного документа, а от открытия формы корректировки отказаться, как вариант.
(8)
16. Андрей Аввакумов (itriot11) 16 14.12.17 16:21 Сейчас в теме
(15)
с учетом того, что это будет работать на 8.3


Кажется, именно об этом я написал в последнем пункте в кате P.S.S.)
На всякий случай - при нажатии он раскроется и покажет текст с примером кода.
11. Сергей Иванов (u_n_k_n_o_w_n) 21 07.12.17 11:22 Сейчас в теме
Я тоже иногда пользуюсь таким механизмом, но совершенно для других целей.
12. Андрей Аввакумов (itriot11) 16 07.12.17 12:27 Сейчас в теме
(11) расскажите свой опыт и цели?
13. Михаил (ILM) 233 13.12.17 09:55 Сейчас в теме
А зачем у вас "Инвентаризация тары" делает движения? Инвентаризация - это фиксация наличия/отсутствия ТМЦ на заданный момент времени.
14. Андрей Аввакумов (itriot11) 16 13.12.17 10:25 Сейчас в теме
(13) я передам ваш комментарий методистам и консультантам предприятия.
Оставьте свое сообщение