Документ "Ручная операция" - это документ, который позволяет напрямую вносить изменения в регистры.
Создавая подобный документ надо учитывать некоторые особенности.
1. Удаление документа ручной корректировки не влечет за собой удаление движения в регистрах. Это надо учитывать и позаботиться об очистке данных регистра при удалении документа.
2. Свойство "Проведение" у документа надо установить равным "Запретить"
3. Не все реквизиты регистров могут быть выведены на форму. Например "Период" - о его заполнении надо позаботиться самостоятельно. Это можно сделать следующими способами:
а) заполнить при записи документа или при записи в форме
Например:
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Для Каждого ЗаписьРегистра Из Объект.Движения.ТоварыНаСкладах Цикл
ЗаписьРегистра.Период = Объект.Дата;
КонецЦикла;
КонецПроцедуры
б) заполнить период м модуле набора записей регистра. При том подходе период будет заполнен в любом случае, в том числе и тогда, когда документ "Ручная корректировка" заполнен программно. Например:
Процедура ПередЗаписью(Отказ, Замещение)
// Получить дату регистратора
ДатаРегистратора = ЭтотОбъект.Отбор.Регистратор.Значение.Дата;
// Принудительно установить значение поля "Период" каждой записи
Для Каждого ЗаписьНабораЗаписей Из ЭтотОбъект Цикл
ЗаписьНабораЗаписей.Период = ДатаРегистратора;
КонецЦикла;
КонецПроцедуры
4. При копировании документа движения не копируются. В методе "При копировании" надо добавить код по заполнению движения. Например:
Процедура ПриКопировании(ОбъектКопирования)
// Перебрать движения документа-источника
ДвиженияОбъектаКопирования = РегистрыНакопления.ТоварыНаСкладах.ВыбратьПоРегистратору(ОбъектКопирования.Ссылка);
Пока ДвиженияОбъектаКопирования.Следующий() Цикл
// Создать новую запись в движениях текущего документа
НовоеДвижение = Движения.ТоварыНаСкладах.Добавить();
// Заполнить поля новой записи регистра
НовоеДвижение.ВидДвижения = ДвиженияОбъектаКопирования.ВидДвижения;
НовоеДвижение.Период = ДвиженияОбъектаКопирования.Период;
НовоеДвижение.Номенклатура = ДвиженияОбъектаКопирования.Номенклатура;
НовоеДвижение.Склад = ДвиженияОбъектаКопирования.Склад;
НовоеДвижение.Количество = ДвиженияОбъектаКопирования.Количество;
КонецЦикла;
КонецПроцедуры
5. Чтобы на форме можно было разместить данные движения документа, надо в свойствах документа на вкладке "Движения" указать необходимые регистры. Если документ может вносить изменения по нескольким регистрам, то мало вероятно, что один документ будет вносить изменения по всем им. В этом случае надо на форму добавить возможность указывать только нужные регистры и заполнять форму программно или через видимость элементов. Для определения списка нужных регистров можно заполнить список значений (таблицу значений) с нужными регистрами и добавить процедуру заполнения на форме страниц с таблицами регистров.
Например, ТаблицаРегистровНакопления содержит список нужных регистров:
&НаСервере
Процедура НастроитьСоставСтраниц()
ДокументОбъект = РеквизитФормыВЗначение("Объект");
ТаблицаРегистров = ТаблицаРегистровНакопления.Выгрузить();
СписокОчищаемыхРегистров = Новый СписокЗначений();
ГруппаСтраницыДинамически = Элементы.ГруппаСтраницыДинамически; //Группа типа Страницы, в которую будем добавлять страницы по нужным регистрам
Для каждого Страница из ТаблицаРегистров Цикл
ИмяСтраницы = "СтраницаДинамическиГруппаСтраница" + Страница.Имя;
Если Элементы.Найти(ИмяСтраницы) <> Неопределено Тогда
Продолжить;
КонецЕсли;
// Создаем страницу
НоваяСтраница = Элементы.Добавить(ИмяСтраницы, Тип("ГруппаФормы"), ГруппаСтраницыДинамически);
НоваяСтраница.Вид = ВидГруппыФормы.Страница;
НоваяСтраница.Заголовок = Страница.Представление;
// Создаем таблицу формы
ТаблицаРегистра = Элементы.Добавить("Движения" + Страница.Имя, Тип("ТаблицаФормы"), НоваяСтраница);
ТаблицаРегистра.ПутьКДанным = "Объект.Движения." + Страница.Имя;
НоваяСтраница.ПутьКДаннымЗаголовка = ТаблицаРегистра.ПутьКДанным + ".КоличествоСтрок";
// Создаем колонки
ТЗНабораЗаписей = ДокументОбъект.Движения[Страница.Имя].ВыгрузитьКолонки();
Для Каждого ТекКолонка Из ТЗНабораЗаписей.Колонки Цикл
Если ТекКолонка.Имя = "Регистратор" Или ТекКолонка.Имя = "Активность" Или ТекКолонка.Имя = "ИсходныйНомерСтроки" или ТекКолонка.Имя = "МоментВремени" Тогда
Продолжить;
КонецЕсли;
НоваяКолонка = Элементы.Добавить("Движения" + Страница.Имя + ТекКолонка.Имя, Тип("ПолеФормы"), ТаблицаРегистра);
НоваяКолонка.ПутьКДанным = "Объект.Движения." + Страница.Имя + "." + ТекКолонка.Имя;
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
КонецЦикла;
КонецЦикла;
// Удаляем страницы и помещаем в список значений имя набора, который будет очещен при записи
Для каждого Страница из Элементы.ГруппаСтраницыДинамически.ПодчиненныеЭлементы Цикл
ИмяДляПоиска = Прав(Страница.Имя,СтрДлина(Страница.Имя) - 33);
Если ТаблицаРегистров.Найти(ИмяДляПоиска, "Имя") = Неопределено Тогда
СписокОчищаемыхРегистров.Добавить(ИмяДляПоиска);
Элементы.Удалить(Страница);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
|