Несколько шаблонов для доработки типовых конфигураций
Разработка - Инструментарий разработчика
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
Пустая конфигурация, которая только выполняет только одно действие - провести и закрыть.
Зачем я написал эту статью?
Возможно, кому-нибудь после прочтения данной публикации придет мысль, что у меня нет собственных идей, и поэтому я пересказываю мысли из типовых конфигураций. НО это не соответствует действительности. На практике я часто сталкиваюсь с ситуацией, что многие разработчики при доработке типовых конфигураций не соблюдают идеологию, заложенную в этих конфигурациях изначально, и придумывают свои способы реализации стандартных действий (например, проведение). При этом зачастую сложность задачи оценивается оптимистично, без учета того, что код будет усложняться при тестировании, демонстрации заказчику, появлении неучтенных моментов и т.д. Это происходит потому, что “вытащить” некоторый механизм из типовой иногда бывает затратно по времени, т.к. там много всего лишнего, связанного со спецификой объекта. Поэтому разработчик понимает, что ему проще придумать свой, пусть неоптимальный механизм, чтобы уложиться в отведенное для задачи время. Из-за этого возникают проблемы на следующих стадиях. Лично мне не очень нравится дорабатывать такие велосипеды. Надеюсь, что после прочтения этой статьи, использовать описанные механизмы будет проще.
Специальные предложения
См. также
Перенос данных КА 1.1 => ERP 2 (ЕРП) (обработка переноса документов, остатков и справочной информации из "1С:Комплексная автоматизация, ред. 1.1" в "1С:ERP Управление предприятием, ред 2"). Обновлен до КА 1.1.115.х и ERP 2.4.10.х Промо
Обработка позволяет переносить из КА 1.1 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления в случае выхода новых релизов конфигураций 1С.
29700 руб.
Перенос данных УТ 10.3 => УТ 11 / КА 2 / ERP 2 (ЕРП 2) (документы, остатки и справочная информация из "1С:Управление торговлей, ред. 10.3" в УТ 11 / КА 2 / ERP 2). Обновлен до УТ 10.3.56.х, УТ 11.4.10.х, КА 2.4.10.х и ERP 2.4.10.х! Промо
Уже более 100 компаний приобрели перенос и выполнили переход на УТ 11 / КА 2 / ERP 2 с помощью нашей разработки! Обработка перехода с УТ 10.3 на УТ 11 / КА 2 / ERP 2 позволяет перенести не только остатки на указанную дату (как типовой перенос), но и все возможные документы за выбранный период. При выходе новых релизов этих программ оперативно выпускаем обновление обработки. Предоставляем техническую поддержку. Можем сделать бесплатный тестовый перенос!
29700 руб.
Перенос данных БП 2.0 => УТ 11 / КА 2 / ERP 2 (перенос остатков, документов и справочников из "1С:Бухгалтерия предприятия 8", ред. 2.0 в "1С:Управление торговлей 8", ред.11 / КА 2 / ERP 2). Обновлено до УТ 11.4.10.х, КА 2.4.10.х, ERP 2.4.10.х! Промо
Перенос позволяет загрузить в УТ 11 / КА 2 / ERP 2 документы за выбранный период, справочную информацию и остатки по счетам бух. учета. Переносятся остатки денежных средств, взаиморасчетов, остатки товаров и материалов на складах. Переносятся девятнадцать основных видов документов за выбранный период и вся нормативно-справочная информация. Есть фильтр по организации. Если нужно переносить что-то дополнительно, то обычно бесплатно дорабатываю правила (перед покупкой согласуйте необходимые доработки).
29700 руб.
Конструктор мобильного клиента Simple WMS Client: способ создать полноценный ТСД без мобильной разработки. Теперь новая версия - Simple UI (обновлено 14.11.2019) 178
5 стартмани
09.01.2019 24858 228 informa1555 187
Перенос документов, остатков и справочников КА 1.1 => КА 2 / УТ 11. Обновлено до КА 2.4.10.х и УТ 11.4.10.х! Промо
Более 130 компаний выполнили переход на КА 2 или УТ 11 с помощью нашей разработки! Позволяет перенести не только остатки и справочники (как типовая обработка), но и документы за нужный период времени. Предоставляем техподдержку, оперативно исправляем замечания, выпускаем обновления при выходе новых релизов программ 1С. Вы можете проверить разработку до покупки: сделаем бесплатный тестовый перенос из вашей базы КА 1.1 и предоставим доступ к базе-результату через веб-клиент!
29700 руб.
Перенос данных УПП 1.3 => ERP 2 (ЕРП) / УТ 11 / КА 2.х (обработка переноса документов, остатков и справочников из "1С:Управление производственным предприятием, ред. 1.3" в ERP / УТ 11 / КА 2). Обновлен до УПП 1.3.127.х, КА 2.4.10.х и ERP 2.4.10.х! Промо
Обработка позволяет переносить из УПП 1.3 в ERP 2 документы за выбранный период и остатки. Типовая обработка от фирмы 1С документы не переносит. Также исправлены ошибки типовой обработки. При выходе новых релизов обновление высылается бесплатно в течение года. Разработка будет полезна фирмам-франчайзи, которые периодически выполняют такой перенос данных для заказчиков. Вы можете один раз приобрести обработку переноса, и потом бесплатно получать обновления при выходе новых релизов конфигураций 1С.
29700 руб.
Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции 65
5 стартмани
09.08.2018 17355 23 informa1555 26
Подборка решений для взаимодействия со ФГИС «Меркурий» Промо
С 1 июля 2019 года все компании, участвующие в обороте товаров животного происхождения, должны перейти на электронную ветеринарную сертификацию (ЭВС) через ФГИС «Меркурий». Инфостарт предлагает подборку программ, связанных с этим изменением.
ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар") 105
1 стартмани
01.06.2018 20986 86 m-rv 57
БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному 242
1 стартмани
10.05.2018 29503 28 dsdred 34
Перенос данных БП 3.0 => УТ 11 / КА 2 / ERP 2 (ЕРП) (перенос остатков, документов и справочной информации из "1С:Бухгалтерия предприятия 8", ред.3.0). Обновлено до БП 3.0.73.х, УТ 11.4.10.х, КА 2.4.10.х., ERP 2.4.10.х! Промо
Переносятся документы за выбранный период, справочная информация и остатки по счетам бух. учета в программу УТ 11 / КА 2 / ЕРП 2 (ERP). Переносятся все возможные виды операций ввода остатков на нужную дату. Есть отбор по периоду переноса документов и фильтр по организации, доступен выбор даты ввода остатков. Если нужно переносить что-то дополнительно, то обычно бесплатно добавляем это в перенос . Смотрите видеодемонстрацию со звуком - советами по переносу и рекомендациями настройки программ.
29700 руб.
Как выполнить отчет на СКД через COM и получить данные отчета? 86
2 стартмани
08.05.2018 19092 10 wowik 3
С 2020 года сервис «Продление поддержки конфигурации 1С:УПП» подорожает вдвое Промо
Успейте продлить поддержку УПП до повышения цен! Фирма «1С» предупредила об изменении цен на сервис «Продление поддержки конфигурации "1С:Управление производственным предприятием"». С 1 января 2020 года сервис подорожает в два раза.
1C:Предприятие для программистов: Запросы и отчеты. Второй поток. Онлайн-интенсив с 17 марта по 16 апреля 2020 г. Промо
Данный онлайн-курс предусматривает углубленное изучение языка запросов и возможностей системы компоновки данных, которые понадобятся при разработке отчетов, работающих на платформе “1С:Предприятие” в рамках различных прикладных решений. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие”, а также для опытных пользователей различных прикладных решений, которые используют в своей работе отчеты разного назначения.
6500 рублей
Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов 124
1 стартмани
01.02.2018 26560 62 rpgshnik 46
Программное создание динамического списка на управляемой форме. (Динамическое создание динамического списка). Готовая процедура + обработка - демонстрационный пример 276
1 стартмани
19.01.2018 41626 61 rpgshnik 26
Онлайн-курс "Технология выполнения проектов ERP-класса – процессный подход". Третий поток. Курс проходит с 21 января по 18 марта 2020 года. Промо
Курс разработан Внедренческим центром «Раздолье». Курс предназначен для подготовки аналитиков, архитекторов и руководителей проектов автоматизации процессов управления с использованием комплексных ИТ-систем (1С:ERP, 1С:УХ, 1С:КА, 1С:УТ). В основе курса лежит методика применения процессного подхода.
9000 рублей
Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула 8
1 стартмани
29.12.2017 24832 21 agent00mouse 0
Печатная форма, сделанная как расширение конфигурации для БП 3.0. Новые возможности БСП 26
1 стартмани
06.12.2017 19521 52 kwazi 6
Базовый курс по разработке мобильных 1C-приложений для Android-устройств. Третий поток. Онлайн-интенсив с 11 февраля по 05 марта 2020 г. Промо
Данный онлайн-курс предусматривает изучение базовых принципов создания приложений для операционной системы Android, работающих на мобильной платформе “1С:Предприятие”. Курс предназначен для тех, кто уже имеет определенные навыки конфигурирования и программирования в системе “1С:Предприятие” при разработке прикладных решений для “обычных” компьютеров, но пока ещё не занимался разработкой 1С-приложений, предназначенных для работы на мобильных устройствах.
7500 рублей
Программное формирование форматированной строки в стиле html+inline CSS 53
1 стартмани
18.11.2017 21184 25 bonv 6
Расширения конфигураций 1С: учимся перехватывать методы 114
1 стартмани
30.05.2017 88707 14 signum2009 45
Программы для исполнения 488-ФЗ: Маркировка товаров Промо
1 января 2019 года вступил в силу ФЗ от 25.12.2018 № 488-ФЗ о единой информационной системе маркировки товаров с использованием контрольных (идентификационных) знаков, который позволяет проследить движение товара от производителя до конечного потребителя. Инфостарт предлагает подборку программ, связанных с применением 488-ФЗ и маркировкой товаров.
Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов 178
26.05.2017 40384 168 DarkAn 86