Предлагаю несколько каркасов для создания новых объектов в типовых конфигурациях. Это выжимка из кода нескольких конфигураций, которая позволит быстро и красиво создавать и дорабатывать объекты метаданных с соблюдением идеологии исходной системы
(1) TODD22,
хотелось бы узнать с какой страницей ИТС вы сравниваете и насколько материал представленный в данной статье совпадает с описанным там. Приведите ссылку на конкретный текст.
Пока предполагаю, что вы путаете шаблон с примером. На ИТС приводятся примеры и методические рекомендации, то есть теория. Я привожу шаблоны, то есть кусочки кода из практики, которые можно вставить при разработке копипастом, изменив несколько деталей. Разница между шаблоном и примером в том, что в примере нужно думать, а в шаблоне вы берете код уже продуманный кем-то другим
хотелось бы узнать с какой страницей ИТС вы сравниваете и насколько материал представленный в данной статье совпадает с описанным там. Приведите ссылку на конкретный текст.
(4) TODD22, на текущий момент у меня нет доступа к указанному вами разделу.
Планирую посмотреть позже, если совпадение действительно существенное, то заменю первый раздел в текущей статье на что-нибудь другое, т.к. не хочу повторять информацию, описанную в других источниках
26.
DmitrySinichnikov
26709.11.22 16:15 Сейчас в теме
(4) Иногда очень не хватает "простых" статей, по типу "вставь это сюда" и все. ИТС крут, никто не спорит, но когда я создаю новый объект я не хочу искать ИТС, я хочу просто вбить за пару секунд запрос в гугл и получить шаблон, все. В данном случае, статья полностью покрыла потребность.
(1)(2)В ИТС уже несколько лет работает тест-драйв.
Хорошая статья, такие нужны - и как можно больше. Чтобы наконец донести свет в массы:) По моему опыту - 6 из 10 программистов о ИТС тупо не знают. А из оставшихся трое - кладут на все это со словами "мне некогда", и тратят в 10 раз больше времени в попытках разобраться со своим-же кодом...
(0) В "модуле менеджера объекта" забыли про директивы компиляции, это очень важно для работы конструктора запросов в "Управляемом приложении (Толстый клиент)", а так же для ЦУП.
Вопрос про "3. Шаблон управляемой формы документа, в котором перед проведением требуется задавать вопросы пользователю с запретом модальных вызовов":
1. Для какой конфигурации у вас примеры? Например ОбщегоНазначения.ОбработатьЗаписьОбъектаВФорме например в БП 3.0.44.124 нет.
Замечания:
1. Не обработана ситуация, когда пользователь нажимает крестик. Он нажимает крестик задаётся 3 вопроса (1 стандартный - платформенный), пользователь ожидает, что документ закроется, но он остаётся. У меня есть статься по данной теме Как использовать ПоказатьВопрос в обработчике формы ПередЗаписью там эта ситуация разбирается.
2. Лучше как нибудь по-другому назвать переменную НеВыполнятьПроверкуПередЗаписью. Тоже когда-то называли переменные с НЕ в начале. Потом появлялись конструкции вида:
Если Не НеВыполнятьПроверкуПередЗаписью Тогда
, которые ломали мозг при прочтении... Долго приходится соображать что делать если НеВыполнятьПроверкуПередЗаписью = Ложь. Плюс где-то на ИТС видел рекомендации 1С, что так называть не стоит.
Думаю заменить НеВыполнятьПроверкуПередЗаписью на ОтключитьПроверкуПередЗаписью будет правильней. Логику менять не придётся, только название переменной.
Да есть такая рекомендация на ИТС.
Мне тут то же досталась самописная конфигурация там таких "Не НеЗагружено" и тд по 10 штук в одном модуле... сиди мозг ломай....
(9) klinval, данный пример из ерпи. Модуль в оригинале называется ОбщегоНазначенияУТКлиент.
Мое мнение такое: если я дорабатываю типовую конфигурацию, то стараюсь максимально следовать принципам, которые в ней используются. Если переменная называется так, и я с этим немного не согласен, то все равно использую подход принятый в системе.
Это совершенно нормально, что не все согласны абсолютно со всеми именами переменных, процедур и т.д.
Если каждый начнет применять собственный подходы (как обычно и происходит), то начинается каша.
По поводу БП - я посмотрю чуть позже, как там реализовано, может быть имеет смысл дополнить статью, подумаю
Вот только получается 1С-ники не следуют своим же правилам...
Когда разбирался в стандартах разработки, я сразу смотрел в типовых(УТ 11 и БП 3). часто встречалось отличие от соглашения по написанию кода.
Там то же люди пишут :)
Когда разбирался в стандартах разработки, я сразу смотрел в типовых(УТ 11 и БП 3). часто встречалось отличие от соглашения по написанию кода.
Смотреть надо в БСП. Я думаю эти огрехи в типовых из-за старого кода - который писался еще в те времена, когда этот момент не был проработан.
(19) По идее, все подобные области должны быть отнесены к разделу "СлужебныеПроцедурыИФункции". Основные разделы модуля регламентированы - именно к ним что-то добавлять не надо. Вот внутри разделов уже можно помещать свое. Скажем, если сложная форма и есть куча обработчиков элементов формы, их можно как-то логически разнести - по страницам например
(9) klinval, не согласен с высказанным замечанием, что покрываются не все случаи. Ваше предположение не соответствует действительности. В моем примере кнопка "Х" не доступна.
(12) я скачал ваш CF-ник. Развернул на пустую базу и крестик доступен (см. приложенный файл).
Но допустим туда куда вы разворачивали крестик недоступен почему-то стал. Вы предлагаете другим тоже делать недоступным "Х" на всех стандартных или новых документах, чтобы предложенный функционал покрывал все случаи?
В форме контрагента в бухгалтерии 3.0 последних релизов тоже используется вопрос перед записью примерно по описанной методике.
На тот момент (03.07.2015) так и было, сейчас же не смотрел. Я оттуда код и взял, т.к. сам до этого не мог обойти эту ситуацию. У меня способ изложен в п.5 статьи.
По поводу покрытия на 100% когда "перед проведением требуется задавать вопросы ": к сожалению это невозможно. В той-же типовой БП вот с чем я столкнулся:
В обработчик формы «ПередЗаписью» программа не заходит, если: 1) пользователь нажал на кнопку «Пометить на удаление / снять пометку»; 2) если пользователь нажал на не проведённом документе кнопку «ДТ/КТ». И это не всё: если вы на форме документа создали всё, как я написал, и пользователь из формы списка перепроведёт документ – то никаких вопросов программа ему не задаст. Необходимо все интересующие вас кнопки на форме списка заменять на свои и отслеживать действия пользователя. Ещё у документа может быть не одна форма документа, а несколько (например, документ ПоступлениеТоваровУслуг в БП 3.0, где 3 формы: общая, товары и услуги). В каждой форме документа надо написать много кода…
+ Можно провести документ с формы обработки (внешней или внутренней)... Некоторые моменты ещё можно обойти, но слишком трудозатратно. Да на 100% покрытия обычно и не требуется.
Я бы в структуру областей модуля формы добавил еще немного областей
#Область УправлениеФормой - здесь сконцентрированы все методы управления свойствами элементов формы (в спойлере пример процедур)
Методы управления свойствами элементов формы
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, ИмяРеквизита)
Если НЕ Обработано.Найти(ИмяРеквизита) = Неопределено Тогда
Возврат;
КонецЕсли;
Обработано.Добавить(ИмяРеквизита);
Элементы = Форма.Элементы;
Объект = Форма.Объект;
// Наборы элементов
Если ИмяРеквизита = "РеквизитыПрочиеВложения" ИЛИ ПустаяСтрока(ИмяРеквизита) Тогда
УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, "СтраницаЗагрузкаДанных");
УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, "СтраницаМатериалыПодрядчика");
УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, "СтраницаМатериалыЗаказчика");
УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, "РезультатПроверкиЗагрузки");
УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, "КомандаОбновитьДанныеТабличнойЧасти");
КонецЕсли;
// Элементы
Если ИмяРеквизита = "СтраницаЗагрузкаДанных" Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СтраницаЗагрузкаДанных", "Видимость", НЕ Объект.ПрочиеВложения);
КонецЕсли;
Если ИмяРеквизита = "СтраницаМатериалыПодрядчика" Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СтраницаМатериалыПодрядчика", "Видимость", НЕ Объект.ПрочиеВложения);
КонецЕсли;
Если ИмяРеквизита = "СтраницаМатериалыЗаказчика" Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"СтраницаМатериалыЗаказчика", "Видимость", НЕ Объект.ПрочиеВложения);
КонецЕсли;
Если ИмяРеквизита = "РезультатПроверкиЗагрузки" Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"РезультатПроверкиЗагрузки", "Видимость", НЕ Объект.ПрочиеВложения);
КонецЕсли;
// Команды
Если ИмяРеквизита = "КомандаОбновитьДанныеТабличнойЧасти" Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ОбновитьДанныеТабличнойЧасти", "Доступность", НЕ ЗначениеЗаполнено(Форма.РеестрАктовВыполненныхРабот));
КонецЕсли;
Если ИмяРеквизита = "КомандаОбновитьДанныеИтоги" Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ИтогиОбновитьДанныеИтоги", "Доступность", НЕ ЗначениеЗаполнено(Форма.РеестрАктовВыполненныхРабот));
КонецЕсли;
Если ИмяРеквизита = "КомандаРедактироватьФормулу" Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ИтогиРедактироватьФормулу", "Доступность", НЕ ЗначениеЗаполнено(Форма.РеестрАктовВыполненныхРабот));
КонецЕсли;
Если ИмяРеквизита = "КомандаОбновитьДанныеТабличнойЧасти" Тогда
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементаФормы(Элементы,
"ОбновитьДанныеТабличнойЧасти", "Видимость", НЕ Объект.ПрочиеВложения);
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Процедура УстановитьУсловноеОформление(Форма, ИменаРеквизитов = "")
Если ТипЗнч(ИменаРеквизитов) = Тип("Строка") Тогда
Если ПустаяСтрока(ИменаРеквизитов) Тогда
МассивИмен = Новый Массив;
МассивИмен.Добавить("");
Иначе
МассивИмен = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ИменаРеквизитов, ",");
КонецЕсли;
ИначеЕсли ТипЗнч(ИменаРеквизитов) = Тип("Массив") Тогда
МассивИмен = ОбщегоНазначенияКлиентСервер.СкопироватьМассив(ИменаРеквизитов);
Иначе
Возврат;
КонецЕсли;
Если НЕ Форма.ТолькоПросмотр Тогда
// общая проверка и установка признака "ТолькоПросмотр"
Форма.ТолькоПросмотр = ЗначениеЗаполнено(Форма.РеестрАктовВыполненныхРабот);
КонецЕсли;
Обработано = Новый Массив;
Для Каждого ИмяРеквизита Из МассивИмен Цикл
УстановитьУсловноеОформлениеРеквизита(Форма, Обработано, СокрЛП(ИмяРеквизита));
КонецЦикла;
КонецПроцедуры
Показать
#Область ЗавершениеНемодальныхВызовов - хотя это спорный момент, кому то нравится по коду распиханные экспорты, мне лично собранные в одном месте
#Область СлужебныеПроцедурыИФункции_БСП - здесь все методы для подсистем БСП которые находятся в форме, причем выделенные в отдельные области вроде Печать, Свойства и т.д.