1. Шаблон областей для модулей объектов, менеджеров, форм
Как многие знают, в типовых конфигурациях код модулей разделен на секции. Это помогает проще ориентироваться в коде.
Я проанализировал различные объекты типовых конфигураций и создал заготовки для :
модуля формы
модуля объекта
модуля менеджера объекта
общего модуля
Замечание: конструкция #Область ИмяОбласти доступна под платформой 8.3, начиная с режима совместимости 8.2
Модуль формы
#Область ОбработчикиСобытийФормы
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормы_ИмяТаблицы
#КонецОбласти
#Область ОбработчикиКомандФормы
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
Модуль объекта
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#КонецОбласти
#Область ОбработчикиСобытий
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
#КонецЕсли
Модуль менеджера
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
#Область ПрограммныйИнтерфейс
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
#КонецЕсли
Общий модуль
#Область ПрограммныйИнтерфейс
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти
2. Шаблон проведения
Данная схема проверена на практике множество раз. Она понятная и расширяемая. Применяется практически для всех типовых документов.
В модуле объекта заполняем два обработчика
Модуль объекта документа
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ДополнительныеСвойства.Вставить("ЭтоНовый", ЭтоНовый());
ДополнительныеСвойства.Вставить("РежимЗаписи", РежимЗаписи);
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(Ссылка, ДополнительныеСвойства,
РежимПроведения);
Документы.<НашДокумент>.ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства);
ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);
<ОбщийМодуль1>Сервер.Отразить<Регистр1>(ДополнительныеСвойства, Движения, Отказ);
<ОбщийМодуль1>Сервер.Отразить<Регистр2>(ДополнительныеСвойства, Движения, Отказ);
ПроведениеСервер.ЗаписатьНаборыЗаписей(ЭтотОбъект);
ПроведениеСервер.ОчиститьДополнительныеСвойстваДляПроведения(ДополнительныеСвойства);
КонецПроцедуры
В модуле менеджера выполняем заполнение движений следующим образом
Модуль менеджера документа
Процедура ИнициализироватьДанныеДокумента(ДокументСсылка, ДополнительныеСвойства,
Регистры = Неопределено) Экспорт
Запрос = Новый Запрос;
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
ТекстыЗапроса = Новый СписокЗначений;
ТекстЗапросаТаблица<Регистр1>(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблица<Регистр2>(Запрос, ТекстыЗапроса, Регистры);
ПроведениеСервер.ИницализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса,
ДополнительныеСвойства.ТаблицыДляДвижений, Истина);
КонецПроцедуры
Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеДокумента.Дата как Период,
| ДанныеДокумента.Организация
|ИЗ
| Документ.<НашДокумент> КАК ДанныеДокумента
|ГДЕ
| ДанныеДокумента.Ссылка = &Ссылка";
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Запрос.УстановитьПараметр("Период", Реквизиты.Период);
Запрос.УстановитьПараметр("Организация", Реквизиты.Организация);
КонецПроцедуры
Функция ТекстЗапросаВременнаяТаблица<ТабличнаяЧасть1>(Запрос, ТекстыЗапроса)
ИмяРегистра = "ВременнаяТаблица<ТабличнаяЧасть1>";
ТекстЗапроса = "
|ВЫБРАТЬ
| тч.НомерСтроки КАК НомерСтроки,
| тч.Поле1 КАК Поле1,
| тч.Поле2 КАК Поле2
|ПОМЕСТИТЬ
| ВременнаяТаблица<ТабличнаяЧасть1>
|ИЗ
| Документ.<НашДокумент>.<ТабличнаяЧасть1> КАК тч
|ГДЕ
| тч.Ссылка = &Ссылка
|";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Функция ТекстЗапросаТаблица<Регистр1>(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "<Регистр1>";
Если НЕ ПроведениеСервер.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
Если НЕ ПроведениеСервер.ЕстьТаблицаЗапроса("ВременнаяТаблица<ТабличнаяЧасть1>", ТекстыЗапроса)
Тогда
ТекстЗапросаВременнаяТаблица<ТабличнаяЧасть1>(Запрос, ТекстыЗапроса);
КонецЕсли;
ТекстЗапроса = "
|ВЫБРАТЬ
| &Период КАК Период,
| &Организация КАК Организация,
| ТаблицаТовары.НомерСтроки КАК НомерСтроки,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Количество КАК Количество
|ИЗ
| ВременнаяТаблица<ТабличнаяЧасть1> КАК ТаблицаТовары
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки
|";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Хочу отметить, что в приведенной схеме сначала табличная часть считывается во временную таблицу, а затем при заполнении движений используется уже эта временная таблица. С одной стороны это исключает повторные обращения к постоянной таблице БД, с другой стороны предоставляет дополнительные удобства (например, можно добавить служебные поля, которые потом использовать).
Кроме того, такая схема хорошо подходит при использовании автоматизированного тестирования (TDD).
3. Шаблон управляемой формы документа, в котором перед проведением требуется задавать вопросы пользователю с запретом модальных вызовов
В типовой конфигурации у формы такого документа есть два служебных реквизита:
Также добавляется служебная команда
В
Модуль формы документа (команды)
&НаКлиенте
Процедура ПровестиИЗакрыть(Команда)
ОбщегоНазначения.ПровестиИЗакрыть(ЭтаФорма);
КонецПроцедуры
Обработчики ПередЗаписью() и ПослеЗаписи() выглядит примерно так:
Модуль формы документа (обработчики событий)
&НаКлиенте
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если НеВыполнятьПроверкуПередЗаписью Тогда
НеВыполнятьПроверкуПередЗаписью = Ложь;
Возврат;
КонецЕсли;
Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Отказ = Истина;
ЗадатьВопрос1(ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПослеЗаписи(ПараметрыЗаписи)
ОбщегоНазначения.ВыполнитьДействияПослеЗаписи(ЭтаФорма, Объект, ПараметрыЗаписи);
КонецПроцедуры
Кроме того, добавляется служебная процедура Подключаемый_ЗакрытьФорму(), т.к. закрытие формы в типовых выполняется через обработчик ожидания, который выставляется после записи.
Модуль формы документа
&НаКлиенте
Процедура Подключаемый_ЗакрытьФорму()
Закрыть();
КонецПроцедуры
Дальше пишем наш код с проверками. Не забываем обработчики завершения делать экспортными. Я проверки написал так:
Модуль формы документа
&НаКлиенте
Процедура ЗадатьВопрос1(ПараметрыЗаписи)
Оповещение = Новый ОписаниеОповещения("ЗадатьВопрос1Завершение", ЭтаФорма, ПараметрыЗаписи);
ТекстВопроса = "Какой-то вопрос 1 ?";
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопрос1Завершение(Результат, ПараметрыЗаписи) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ЗадатьВопрос2(ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопрос2(ПараметрыЗаписи)
Оповещение = Новый ОписаниеОповещения("ЗадатьВопрос2Завершение", ЭтаФорма, ПараметрыЗаписи);
ТекстВопроса = "Какой-то вопрос 2 ?";
ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет);
КонецПроцедуры
&НаКлиенте
Процедура ЗадатьВопрос2Завершение(Результат, ПараметрыЗаписи) Экспорт
Если Результат = КодВозвратаДиалога.Да Тогда
ПередЗаписьюЗавершение(ПараметрыЗаписи);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПередЗаписьюЗавершение(ПараметрыЗаписи)
Результат = ОбщегоНазначения.ОбработатьЗаписьОбъектаВФорме(ЭтаФорма, ПараметрыЗаписи);
КонецПроцедуры
Хочу обратить внимание, что процедура ПередЗаписью() на клиенте вызывается два раза. Причем первый раз в ней выставляется Отказ=Истина, и вызывается первая процедура из цепочки вопросов. Если пройдены все необходимые проверки, то ПередЗаписью() вызывается второй раз программно, при этом начинается запись. Все обработчики записи/проведения из модуля объекта и модуля формы вызываются только после второго попадания в процедуру ПередЗаписью()
Файлы к статье
Шаблон 1
Шаблон 2
Пустая конфигурация, которая выполняет единственное действие - проведение некоторого документа по описанной схеме.
Шаблон 3
Пустая конфигурация, которая только выполняет только одно действие - провести и закрыть.
Источник: http://infostart.ru/public/552536/
|