Для начала нужно сделать реквизит и добавить его на форму. Данные реквизита я решил хранить отдельно от самого документа в регистре сведений, причины простые - я хочу избежать возможности удаления данных при постановке документа обратно на поддержку и как следствие хочу, что бы мои проводки оставались при перепроведении старых документов даже если документ полностью заменили типовым и вернули на поддержку.
Соответственно создаю регистр "ДатыКнигиПокупок" (измерения Документ и Дата, на один документ может быть несколько дат) и общий модуль "Мув_ДополнительныеСообщенияПроведения". Далее снимаю с поддержки форму документа "СчетФактураПолученный" и в ней добавляем
&НаСервере
Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
// vde69 - сохранение реквизита "Мув_ДатаОплаты"
Мув_ДополнительныеСообщенияПроведения.ПередЗаписьюНаСервере(ЭтаФорма, Отказ, ТекущийОбъект, ПараметрыЗаписи);
// vde69 - Конец сохранения реквизита "Мув_ДатаОплаты"
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// vde69 - Добавление реквизита "Мув_ДатаОплаты"
Мув_ДополнительныеСообщенияПроведения.ФормаПриСозданииНаСервере(ЭтаФорма, "Продавец", "ГруппаШапкаПравая");
// vde69 - Конец добавления реквизита "Мув_ДатаОплаты"
Собственно это все что мне придется контролировать при обновлении. Далее делаем 2 подписки на событие
"ПриЗаписиДокументовКнигиПокупок" и "ПриПроведенииДокументовКнигиПокупок", идем в новый модуль и там пишем
Процедура ПроведениеДокументовОбработкаПроведения(Источник, Отказ, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
ИначеЕсли Отказ Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Если Метаданные.Документы.Содержит(Источник.Ссылка.Метаданные()) Тогда
ДополнительныеДвижения(Источник);
КонецЕсли;
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
Процедура ПриЗаписиДокументовКнигиПокупокПриЗаписи(Источник, Отказ) Экспорт
Перем МассивДатОплатКнигиПокупок;
Если Источник.ДополнительныеСвойства.Свойство("МассивДатОплатКнигиПокупок", МассивДатОплатКнигиПокупок) = Истина Тогда
// сохранение дат в регистр
мРег = РегистрыСведений.ДатыКнигиПокупок.СоздатьНаборЗаписей();
мРег.Отбор.Документ.Установить(Источник.Ссылка, Истина);
мРег.Прочитать();
мТЗ = мРег.ВыгрузитьКолонки();
Для Каждого эл из МассивДатОплатКнигиПокупок Цикл
НоваяСтрока = мТЗ.Добавить();
НоваяСтрока.Документ = Источник.Ссылка;
НоваяСтрока.Дата = Эл;
КонецЦикла;
мРег.Загрузить(мТЗ);
мРег.Записать(Истина);
Иначе
// это запись не из формы - нужно прочитать из регистра и положить в доп свойства
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ДатыКнигиПокупок.Дата
|ИЗ
| РегистрСведений.ДатыКнигиПокупок КАК ДатыКнигиПокупок
|ГДЕ
| ДатыКнигиПокупок.Документ = &Документ");
Запрос.УстановитьПараметр("Документ", Источник.Ссылка);
МассивДатОплатКнигиПокупок = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Дата");
Источник.ДополнительныеСвойства.Вставить("МассивДатОплатКнигиПокупок", МассивДатОплатКнигиПокупок);
КонецЕсли;
КонецПроцедуры
Процедура ФормаПриСозданииНаСервере (КонтекстФормы, ИмяСледующегоРеквизита, ИмяГруппыВставки) Экспорт
// добавляем текстовый реквизит "Мув_ДатаОплаты" в группу "ИмяГруппыВставки" перед элементом "ИмяСледующегоРеквизита"
// заполняет этот реквизит из регистра
Объект = КонтекстФормы.РеквизитФормыВЗначение("Объект");
ДобавляемыеРеквизиты = Новый Массив;
мРеквизиты = КонтекстФормы.ПолучитьРеквизиты();
РеквизитЕсть = Ложь;
Для Каждого тРек из мРеквизиты Цикл
Если "Мув_ДатаОплаты" = тРек.Имя Тогда
РеквизитЕсть = Истина;
КонецЕсли;
КонецЦикла;
Если не РеквизитЕсть Тогда
КС = Новый КвалификаторыСтроки(100);
Массив = Новый Массив;
Массив.Добавить(Тип("Строка"));
ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("Мув_ДатаОплаты", ОписаниеТиповС));
КонецЕсли;
КонтекстФормы.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
// заполним реквизит
Запрос = Новый Запрос(
"ВЫБРАТЬ
| ДатыКнигиПокупок.Дата
|ИЗ
| РегистрСведений.ДатыКнигиПокупок КАК ДатыКнигиПокупок
|ГДЕ
| ДатыКнигиПокупок.Документ = &Документ");
Запрос.УстановитьПараметр("Документ", Объект.Ссылка);
мТекст = "";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
мТекст = мТекст + ";" + Формат(Выборка.Дата, "ДЛФ=D");
КонецЦикла;
Если Лев(мТекст, 1) = ";" Тогда
мТекст = Сред(мТекст, 2);
КонецЕсли;
КонтекстФормы.Мув_ДатаОплаты = мТекст;
// создание поля на форме
СледующийРеквизит = КонтекстФормы.Элементы.Найти(ИмяСледующегоРеквизита);
ГруппаДляВставки = КонтекстФормы.Элементы.Найти(ИмяГруппыВставки);
Для Каждого эл из ДобавляемыеРеквизиты Цикл
НовыйЭлемент = КонтекстФормы.Элементы.Вставить(эл.Имя, Тип("ПолеФормы"), ГруппаДляВставки, СледующийРеквизит);
НовыйЭлемент.ПутьКДанным = эл.Имя;
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.Заголовок = "Даты оплаты";
КонецЦикла;
КонецПроцедуры
Функция ПривестиКДате (ДатаСтрокой, Формат)
сГод = "";
сМесяц = "";
сДень = "";
сДлина = стрДлина(Формат);
Для сч = 1 по сДлина Цикл
СимволФормата = Сред(Формат, сч, 1);
Если СимволФормата = "d" Тогда
сДень = сДень + Сред(ДатаСтрокой, сч, 1);
ИначеЕсли СимволФормата = "M" Тогда
сМесяц = сМесяц + Сред(ДатаСтрокой, сч, 1);
ИначеЕсли СимволФормата = "y" Тогда
сГод = сГод + Сред(ДатаСтрокой, сч, 1);
КонецЕсли;
КонецЦикла;
Попытка
Результат = Дата(Число(сГод), Число(сМесяц), Число(сДень));
Исключение
Результат = Неопределено;
КонецПопытки;
Возврат Результат;
КонецФункции
Процедура ПередЗаписьюНаСервере(КонтекстФормы, Отказ, ТекущийОбъект, ПараметрыЗаписи) Экспорт
Если Отказ Тогда
Возврат;
КонецЕсли;
Попытка
МассивДатОплатКнигиПокупок = Новый Массив;
мСтрока = КонтекстФормы.Мув_ДатаОплаты;
мМассив = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(мСтрока, ";", Ложь);
мТекст = "";
Для Каждого эл из мМассив Цикл
мДата = ПривестиКДате (эл, "dd.MM.yyyy");
МассивДатОплатКнигиПокупок.Добавить(мДата);
нДата = Формат(мДата, "ДЛФ=D");
Если нДата <> эл Тогда
ВызватьИсключение "Ошибка форматы даты";
КонецЕсли;
мТекст = мТекст + ";" + Формат(нДата, "ДЛФ=D");
КонецЦикла;
Если Лев(мТекст, 1) = ";" Тогда
мТекст = Сред(мТекст, 2);
КонецЕсли;
КонтекстФормы.Мув_ДатаОплаты = мТекст;
ТекущийОбъект.ДополнительныеСвойства.Вставить("МассивДатОплатКнигиПокупок", МассивДатОплатКнигиПокупок);
Исключение
Отказ = Истина;
Сообщить("Ошибка формата даты оплаты");
КонецПопытки;
КонецПроцедуры
результат:
мы имеем на форме текстовое поле, которое при записи документа сохраняется в виде нескольких строк в регистре, а при проведении корректируются проводки по регистру книги покупок.
Все бухи довольны, система надежна на отказ, обновление почти безболезнены...