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

