Коллеги, добрый день, в продолжение темы Применение cтандартов и методик разработки конфигураций на практике предлагаю вашему вниманию уже готовые шаблоны текста для применения cтандартов и методик разработки конфигураций 1С, работают на версии платформы 8.3.22.1851. В шаблонах содержится код с примерами, в некоторых случаях краткое пояснение (комментарии), как следует писать, а как будет неверно, текстовка взята с офиц. сайта 1С. Некоторые короткие можно сразу применять в коде, некоторые с пояснениями можно формировать отдельно и брать необходимую часть и адаптировать в рабочий код. Основная цель шаблонов - ускорить и облегчить применение стандартов сразу в коде или использовать как справочник - помощник для корректировки кода и т.д.
Часть шаблонов сгруппированы для быстрого поиска, например:
Ст_Запрос(ы)<ДетальнаяРасшифровка>, Ст_Локализация<ДетальнаяРасшифровка>, Ст_Блокировки(а)<ДетальнаяРасшифровка> и т.д. скрины ниже:
Можно использовать как справочник-помощник:
Список шаблонов:
Добавлены шаблоны:
Ст_ОткрытиеФормыСОповещением
Ст_ИменаРолей
Ст_СообщениеИнформацияОбОшибке
Ст_СообщениеКлиентИнформацияОбОшибке
Ст_ЛокализацияНСтр
Ст_ЗакомментированныйКод
Ст_ЗапросИспользованиеСсылки
Ст_ИнициализацияПарамВложенныхМетодов
Ст_ПоказатьВыборИзСпискаСОповещением
Ст_ПоказатьВыборИзМенюСОповещением
Ст_ПоказатьПредупреждениеСОповещением
Ст_ПоказатьВопрос
Ст_УстановитьПривилегированныйРежим
Ст_ЗапросИспКомментарияДляПомещенияВоВремТаб
Ст_УдалениеЭлементаКоллекции
Ст_ТекущаяДатаСеанса
Ст_ОбменДаннымиОписание
Ст_ТранзакцияЯвнаяЗаписьВЖурналРегистрации
Ст_ТранзакцияЯвнаяВызватьИсключение
Ст_ЗаписьВЖурналРегистрацииБСП
Ст_ЗаписьВЖурналРегистрацииБезБСП
Обновления.
Версия 1.1.3 описание изменений:
1. Укорочены названия в контекстной подсказке, для лучшей читаемости при подборе в коде.
2. Добавлено окончание Описание в конец названия шаблона для описательных шаблонов с пояснением. Если шаблон сразу применим в коде то он идет без окончания Описание.
3. Исправлены ошибки.
Добавлены шаблоны:
Ст_ЗначенияРеквизитовОдногоОбъекта
Ст_ЗначениеОдногоРеквизитаОдногоОбъекта
Ст_ЗначенияНесколькихРеквизитовЭлементовОдногоТипа
Ст_ЗначениеОдногоРеквизитаЭлементовОдногоТипа
Ст_ЗапросРазыменованиеРегистрНакопления
Ст_ЗапросРазыменованиеРегистрСведений
Ст_ЗапросРазыменованиеРегистрБухгалтерии
Ст_ЗапросРазыменованиеРегистрРасчета
Ст_БлокировкаСправочникаУправляемая
Ст_БлокировкаДокументаУправляемая
Ст_БлокировкаОбъектаЗаблокироватьДанныеДляРедактирования
Ст_БлокировкаОбъектаЗаблокировать
Ст_СсылкаСуществует
Ст_ПоказатьПредупреждение
Ст_ЗагрузкаMXL_в_ТаблЗначений
Ст_ПоказатьПредупреждениеСПараметром
Ст_ПоказатьПредупреждениеСПараметромИОповещением
Ст_ИнструкцииПрепроцессораМодулейОбъектовМенеджеров
Ст_ПерехватИсключенийКлиент
Ст_БезопасноеХранениеПаролейЗапись
Ст_БезопасноеХранениеПаролейЧтение
Ст_СообщениеСПараметрамиБезБСП
Ст_СообщениеПростоеБезБСП
Ст_СообщениеОшибкаБезБСП
Ст_НачатьПомещениеФайлаНаСервер
Ст_ПоказатьВводСтроки
Ст_НачатьЗапускПриложений
Ст_ОбменДаннымиЗагрузка
Ст_ПопыткаЗаписьВЖурнРегБСП
Ст_ПопыткаЗаписьВЖурнРегБезБСП
Ст_ДлинаСтроки140
Ст_ДлинаСтроки160
Ст_ЗаписьВЖурнРег+СообщениеБСП
Ст_БлокировкаОбъектаУправляемаяБСП
Примеры шаблонов:
Описательные в качестве справки.
Ст_ЗапросыРазыменованиеПолейОписание
Запрос.Текст = "ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ВЫБОР
| КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Номер
| КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказКлиента
| ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказКлиента).Номер
| КОНЕЦ КАК Номер,
| ВЫБОР
| КОГДА Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.РеализацияТоваровУслуг).Дата
| КОГДА Продажи.Регистратор ССЫЛКА Документ.ЗаказКлиента
| ТОГДА ВЫРАЗИТЬ(Продажи.Регистратор КАК Документ.ЗаказКлиента).Дата
| КОНЕЦ КАК Дата,
| Продажи.ВРезерве КАК ВРезерве,
| Продажи.КОтгрузке КАК КОтгрузке
|ИЗ
| РегистрНакопления.ТоварыКОтгрузке КАК Продажи
|ГДЕ
| (Продажи.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
| ИЛИ Продажи.Регистратор ССЫЛКА Документ.ЗаказКлиента)";
Ст_БезопасностьПОВызывЧерезОткрытыеИнтерфейсыОписание
// В частности, перед программным открытием документов Microsoft Word и Microsoft Excel
// через COM следует запрещать исполнение макросов.
// Иначе это может привести к выполнению вредоносных макросов (вирусов),
// если таковые присутствуют в документе.
// НЕПРАВИЛЬНО открывать документ Microsoft Word по умолчанию:
ОбъектWord = Новый COMОбъект("Word.Application");
Документ = ОбъектWord.Documents.Open(ИмяФайла);
// ПРАВИЛЬНО открывать документ Microsoft Word с отключением макросов:
ОбъектWord = Новый COMОбъект("Word.Application");
ОбъектWord.WordBasic.DisableAutoMacros(1);
Документ = ОбъектWord.Documents.Open(ИмяФайла);
// ПРАВИЛЬНО открывать документ Microsoft Excel с отключением макросов:
ОбъектExcel = Новый COMОбъект("Excel.Application");
ОбъектExcel.AutomationSecurity = 3; // msoAutomationSecurityForceDisable = 3
Документ = ОбъектExcel.Workbooks.Open(ИмяФайла);
// Проверку наличия подписи макросов в документах Microsoft Word можно реализовать так:
ОбъектWord = Новый COMОбъект("Word.Application");
ОбъектWord.WordBasic.DisableAutoMacros(1); // Отключить автозапуск
Документ = ОбъектWord.Documents.Open(ФайлДокумента);
Если Документ.VBASigned Тогда
ОбъектWord.WordBasic.DisableAutoMacros(0); // Включить автозапуск
Документ.RunAutoMacro(2); // wdAutoOpen = 2
Иначе
Документ.Close();
ВызватьИсключение НСтр(" ru = 'Документ не подписан. Открытие отменено.'");
КонецЕсли;
// Проверку наличия подписи макросов в документах Microsoft Excel можно реализовать так:
ОбъектExcel = Новый COMОбъект("Excel.Application");
ИсходныйУровеньБезопасности = ОбъектExcel.AutomationSecurity;
ОбъектExcel.AutomationSecurity = 3; // msoAutomationSecurityForceDisable = 3
Документ = ОбъектExcel.Workbooks.Open(ФайлДокумента);
ОбъектExcel.AutomationSecurity = ИсходныйУровеньБезопасности;
Если Документ.VBASigned Тогда
Документ.Close();
Документ = ОбъектExcel.Workbooks.Open(ФайлДокумента);
Иначе
Документ.Close();
ВызватьИсключение НСтр(" ru = 'Документ не подписан. Открытие отменено.'");
КонецЕсли;
Ст_БлокировкаОтветственноеЧтениеОписание
// Неправильно:
// 1. Прочитать регистр сведений
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЗаметкиПоПредмету.КоличествоЗаметок КАК КоличествоЗаметок
|ИЗ
| РегистрСведений.ЗаметкиПоПредмету КАК ЗаметкиПоПредмету
|ГДЕ
| ЗаметкиПоПредмету.Предмет = &Предмет");
Запрос.УстановитьПараметр("Предмет", ПредметЗаметок);
Выборка = Запрос.Выполнить().Выбрать();
КоличествоЗаметок = 0;
Если Выборка.Следующий() Тогда
КоличествоЗаметок = Выборка.КоличествоЗаметок;
КонецЕсли;
// 2. Записать в регистр сведений
НаборЗаписей = РегистрыСведений.ЗаметкиПоПредмету.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Предмет.Установить(ПредметЗаметок);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Предмет = ПредметЗаметок;
НоваяЗапись.КоличествоЗаметок = КоличествоЗаметок + 1;
НаборЗаписей.Записать();
// Правильно:
// 1. Начать транзакцию для пакета из двух операций чтения и записи регистра
НачатьТранзакцию();
Попытка
// 2. Установить исключительную блокировку на интересующий диапазон записей регистра,
// для того чтобы гарантировать, что в момент записи количество заметок не изменилось с момента чтения в каком-либо другом сеансе.
БлокировкаДанных = Новый БлокировкаДанных;
ЭлементБлокировкиДанных = БлокировкаДанных.Добавить("РегистрСведений.ЗаметкиПоПредмету");
ЭлементБлокировкиДанных.УстановитьЗначение("Предмет", ПредметЗаметок);
ЭлементБлокировкиДанных.Режим = РежимБлокировкиДанных.Исключительный;
БлокировкаДанных.Заблокировать();
// 3. Прочитать регистр сведений
Запрос = Новый Запрос(
"ВЫБРАТЬ РАЗРЕШЕННЫЕ
| ЗаметкиПоПредмету.КоличествоЗаметок КАК КоличествоЗаметок
|ИЗ
| РегистрСведений.ЗаметкиПоПредмету КАК ЗаметкиПоПредмету
|ГДЕ
| ЗаметкиПоПредмету.Предмет = &Предмет");
Запрос.УстановитьПараметр("Предмет", ПредметЗаметок);
Выборка = Запрос.Выполнить().Выбрать();
КоличествоЗаметок = 0;
Если Выборка.Следующий() Тогда
КоличествоЗаметок = Выборка.КоличествоЗаметок;
КонецЕсли;
// 4. Записать в регистр сведений
НаборЗаписей = РегистрыСведений.ЗаметкиПоПредмету.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Предмет.Установить(ПредметЗаметок);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Предмет = ПредметЗаметок;
НоваяЗапись.КоличествоЗаметок = КоличествоЗаметок + 1;
НаборЗаписей.Записать();
ЗафиксироватьТранзакцию(); // Пишем всегда перед словом Исключение
Исключение
// 5. Если при установке блокировки возникла исключительная ситуация из-за того, что регистр уже заблокирован в другом сеансе (или по другим причинам),
// отменить транзакцию и записать сведения об ошибке в журнал регистрации.
ОтменитьТранзакцию(); // Пишем сразу после слова Исключение
ПодробноеПредставлениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(НСтр(" ru = 'Заметки'", ОбщегоНазначения.КодОсновногоЯзыка()), // записывать в ЖР с ВызватьИсключение не нужно
УровеньЖурналаРегистрации.Ошибка,,, СтрШаблон(НСтр(" ru = '%1'"), ПодробноеПредставлениеОбОшибке)); // без ВызватьИсключение пишем в ЖР
ВызватьИсключение; // есть внешняя транзакция
КонецПопытки;
Применяемые непосредственно в коде.
Ст_ТранзакцияЯвнаяЗаписьВЖурналРегистрации
НачатьТранзакцию();
Попытка
<?>
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
ПодробноеПредставлениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(НСтр(" ru = 'Ошибка изменения данных'"),
УровеньЖурналаРегистрации.Ошибка,
,
,
ПодробноеПредставлениеОбОшибке);
КонецПопытки;
Ст_БлокировкаОбъектаЗаблокироватьДанныеДляРедактирования
ТекущаяВерсия = <?>;
ИзменитьОбъект = Истина;
Попытка
ЗаблокироватьДанныеДляРедактирования(ТекущаяВерсия);
Исключение
ИзменитьОбъект = Ложь;
КодЯзыка = ОбщегоНазначения.КодОсновногоЯзыка();
ЗаписьЖурналаРегистрации(СтрШаблон(НСтр(" ru = 'Не удалось заблокировать %1'", КодЯзыка),
ТекущаяВерсия),
УровеньЖурналаРегистрации.Предупреждение,,
ТекущаяВерсия,
ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Если ИзменитьОбъект Тогда
ТекущийОбъект = ТекущаяВерсия.ПолучитьОбъект();
ТекущийОбъект.ПолноеНаименование = ПолноеНаименование;
ТекущийОбъект.Записать();
КонецЕсли;
Ст_ЗаписьВЖурнРег+СообщениеБСП
ТекстСообщения = НСтр(" ru = 'Ошибка выполнения операции <?>'");
КраткоеОписаниеОшибки = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
ОбщегоНазначения.СообщитьПользователю(
СтрШаблон(НСтр(" ru = '%1 %2'"), ТекстСообщения, КраткоеОписаниеОшибки));
ПодробноеПредставлениеОбОшибке = ОбработкаОшибок.ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(НСтр(" ru = 'Исключительная ситуация.'",
ОбщегоНазначения.КодОсновногоЯзыка()),
УровеньЖурналаРегистрации.Ошибка, , ,
СтрШаблон(НСтр(" ru = '%1 %2'"),
ТекстСообщения,
ПодробноеПредставлениеОбОшибке))
Примечание.
В шаблоны не вошли некоторые стандарты, например, по проектированию интерфейсов.
Краткая инструкция по подключению шаблонов.
Шаблоны тексты подключаются в конфигураторе через Сервис - Параметры, вкладка Модули - Контекстная подсказка, нужно включить флаг "Включить шаблоны в список подсказок", скрин:
Далее добавляем шаблоны из публикации. Копируем файл шаблонов в любое место вашего компьютера или сервера где они будут надежно храниться и прописываем путь к этим шаблонам из конфигуратора пункт меню Сервис - Шаблоны текста, далее как на скрине ниже:
Все готово к работе, вызываем в модуле, пишем префикс ст, ctrl + Пробел, в контекстном меню подбираем нужный шаблон.
Примечание.
Так же можно использовать шаблоны вместе со стандартными тогда флаг "Использовать стандартные шаблоны" снимать не нужно.
Также предлагаю решения вашему вниманию:
Простой пример разработки регулярного обмена с использованием БСП на примере ERP 2.4 и УПП 1.3.
Универсальный отчет для сравнения записей регистров накопления между базами.
Универсальная выгрузка и загрузка зарегистрированных справочников и документов по узлу.
Загрузка данных из унифицированных форм УПД и ТОРГ-12.
Список документов и их количество в базе.