Регламент разработки кода и конфигураций в системе 1С Предприятие 8 1 Оглавление ВВЕДЕНИЕ. 4 РАЗДЕЛ I. ОБЯЗАТЕЛЬНЫЕ ТРЕБОВАНИЯ. 4 1. Именование переменных и процедур 1.1 Использование префиксов 1.2 Правила образования имен переменных 1.3 Правила образования имен процедур (функций) 1.4 Правила образования имен элементов управления 4 4 4 5 5 2. Оформление модулей 2.1 Общие положения 2.2 Структура модулей 2.3 Тексты модулей 2.4 Оформление конструкций встроенного языка 2.5 Процедуры и функции 2.6 Переменные 2.7 Комментарии 5 5 6 7 9 9 10 11 3. Правила разработки конфигураций и использования конструкций встроенного языка 3.1 Порядок записи движений документов 3.2 Получение представлений для ссылочных значений в табличном документе 3.3 Обращение к базе данных в обработчиках часто вызываемых событий 3.4 Интерактивный поиск в табличном поле 3.5 Многократное выполнение однотипных запросов 3.6 Приведение значений измерений составного типа записей регистров 3.7 Использование строковых реквизитов неограниченной длины в объектах 3.8 Пометка удаления подчиненных документов (справочников) 3.9 Использование "ОБЪЕДИНИТЬ" и "ОБЪЕДИНИТЬ ВСЕ" в запросах 3.10 Работа с использованием сервера 1С:Предприятие 8.0 и в режиме внешнего соединения 11 11 11 12 12 12 12 13 13 13 Свойства объектов метаданных 4.1 Общие требования к имени, синониму, комментарию 4.2 Общие требования к типам (реквизитов и пр.) 4.3 Общие требования к ведущим объектам 4.4 Общие требования к реквизитам и табличным частям объектов 4.5 Справочники 4.6 Нумераторы документов 4.7 Документы 4.8 Регистры сведений 4.9 Регистры накопления 4.10 Отчеты 14 14 15 15 15 16 16 17 17 17 18 4. 5. Перечень грубых ошибок по платформе v8 14 18 РАЗДЕЛ II. РЕКОМЕНДАТЕЛЬНЫЕ ТРЕБОВАНИЯ. 19 1. 19 19 19 Правила разработки конфигураций и использования конструкций встроенного языка 1.1 Обработчики событий 1.2 Присвоение результатов функции Вопрос() 2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18 Использование таймаутов в модальных диалогах Установка отбора в запросах с помощью вложенных запросов Использование свойств ЭтотОбъект, ЭтаФорма Использование общей формы индикации выполнения процесса Сортировка строк таблиц значений Получение представлений для ссылочных значений Получение метаданных объектов Установка текста в ячейках табличного поля Сравнение с логической константой Обращение к свойству ТекущаяСтрока табличного поля. Правила работы с последовательностями Использование конструктора объекта "ОписаниеТипов" Использование объекта РегистрСведенийМенеджерЗаписи Использование фильтра в запросах для полей составного типа Использование в запросах виртуальной таблицы «ОстаткиИОбороты» Выгрузка результата запроса в список значений 19 19 20 20 20 20 20 21 21 21 21 22 22 23 23 24 2. Работа с запросами 2.1 Оформление текстов запросов 2.2 Конструирование запросов 24 24 25 3. Стандартные действия при начале и завершении работы 3.1 Общие положения 3.2 Первый запуск конфигурации и первоначальное заполнение ИБ 3.3 Первый запуск нового релиза и обновление ИБ 3.4 Запрос при закрытии программы 26 26 26 27 27 РАЗДЕЛ III. ОСОБЕННОСТИ РАБОТЫ С ХРАНИЛИЩЕМ КОНФИГУРАЦИИ 1.1 1.2 1.2.1 1.2.2 1.3 1.4 1.5 1.6 1.7 Принцип работы Режимы использования Работа с подключением информационной базы к хранилищу Работа без подключения информационной базы к хранилищу Режим совместимости хранилища конфигурации Контроль ссылочной целостности Особенности конфигурирования Удаление объектов конфигурации Оптимизация хранения данных в хранилище конфигурации 27 27 29 29 29 30 30 31 31 34 3 Введение. Данный регламент является технических компетенций. обязательным к исполнению для всех сотрудников группы Раздел I. Обязательные требования. 1. Именование переменных и процедур 1.1 Использование префиксов 1.1.1 Использование префиксов при доработке типовых конфигураций При доработке типовых конфигураций фирмы 1С и партнеров префиксируются: объекты метаданных. (Правила образования имен объектов метаданных описаны в отдельном стандарте); общие модули; элементы управления форм. Все вышеперечисленные объекты должны начинаться префикса указанного в описании проекта. 1.1.2 Использование префиксов при создании и доработке оригинальных конфигураций Префиксируются: • переменные; • процедуры, функции. Префиксируются только экспортируемые переменные и процедуры: Экспортируемые переменные модуля приложения гл Экспортируемые процедуры модуля приложения гл Экспортируемые процедуры общих модулей не префиксируются Экспортируемые переменные модуля объекта не префиксируются Переменные модуля формы м 1.2 Правила образования имен переменных 1.2.1 Именование переменных Имена переменных (параметров) следует образовывать от терминов предметной области. При именовании переменных следует использовать только термины, используемый в документации к 1С:Предприятие 8.0 или в методических материалах фирмы «1С» по 1С:Предприятие 8.0. Из имени переменной должно быть понятно ее назначение. Имена следует образовывать путем «склеивания» слов - удаления пробелов между словами. Каждое отдельное слово в «склеенном» имени пишется с прописной буквы. Предлоги и местоимения из одной буквы также пишутся прописными буквами. 4 Например: количество пачек в коробке - КоличествоПачекВКоробке Имена переменных не следует начинать с подчеркивания. Имена переменных ни в коем случае не должны состоять из одного символа. Использование коротких имен переменных допускается только для счетчиков циклов. 1.2.2 Именование переменных флагов В процедурах периодически используются переменные, которые содержат в себе некий флаг. Такие переменные следует называть так, как называется истинное значение этого флага. Например, если нужна переменная, в которой хранится признак наличия ошибок в процедуре, то такая переменная должна называться ЕстьОшибки. Или если есть признак того, что товар относится к возвратной таре, то такой признак должен называться ЭтоТара. 1.3 Правила образования имен процедур (функций) Имена процедур и функции должны давать представление о характере выполняемых процедурой (функцией) действий. 1.3.1 Именование функций флагов Функции, которые предназначены для проверки чего-либо, и возвращают в качестве результата проверки булево значение, следует именовать так, как называется результат проверки Истина. Например, если функция должна проверить наличие дублей строк в табличной части документа, то она должна называться ЕстьДублиСтрок(). Или если функция должна проверить принадлежность документа к накладным, то она должна называться ЭтоНакладная(). Однако, если функция (или процедура) ЕстьДублиСтрок() и проверяет наличие дублей строк, и выполняет объединение дублирующих строк, при этом не возвращает значения, ее следует именовать СвернутьДублиСтрок(). 1.3.2 Имена обработчиков событий Используются имена процедур - обработчиков событий, формируемые системой автоматически: <имя реквизита> + <название события> Имена по умолчанию формируются при нажатии «лупы» около события в окне свойств реквизита диалога. По таким же правилам следует образовывать имена обработчиков самостоятельно. 1.4 Правила образования имен элементов управления Имена надписей образуются по следующим правилам: - если надпись относится к элементу управления, имя составляет как «Надпись»+ ИмяЭлементаУправления; - в остальных случаях им составляется как «Надпись»+ИмяНадписи. Для имен рамок используется префикс «Рамка». Для имени группы формы используется префикс "Группа" Для командной панели формы используется префикс «КоманднаяПанель». Для имен командных панелей табличных частей формы используется префикс «КоманднаяПанель»+ИмяТабличнойЧасти, например, КоманднаяПанельСпецификация. Элементы Управления, связанные с данными, называются так же, как данные. 2. Оформление модулей 2.1 Общие положения Тексты модулей должны быть написаны на русском языке. Размер табуляции стандартный (4 символа). 5 Программные модули не должны иметь неиспользуемых процедур и функций. При внесении изменений в модули типовых конфигураций фирмы 1С или конфигураций партнеров следует выделять фрагменты кода следующими комментариями: При добавлении строк кода: // <Префикс>, <НомерЗадачи>, <Исполнитель>, <Дата> ++ Добавленные строки кода // -При изменении строк кода: // <Префикс>, <НомерЗадачи>, <Исполнитель>, <Дата> // // Исходные строки кода // ++ Измененные строки кода // -Пример: // ПРОФ-ИТ, Иванов В.П, #100, 2011-08-15 // //| ТрудовойДоговорПерсональныеНадбавки.Валюта // ++ | ТрудовойДоговорПерсональныеНадбавки.Валюта, | ТрудовойДоговорПерсональныеНадбавки.ХН_КурсТрудовогоДоговора // -Рекомендуется для внесения данных комментариев настроить файл шаблонов. 2.2 Структура модулей 2.2.1 Общая структура модулей Модуль разделяется на условные секции: 1. секция описания переменных; 2. секция «служебных» функций и процедур (не вошедших в другие секции); 3. секция обработчиков событий, вызываемых из элементов форм; 4. секция обработчиков системных событий; 5. секция тела модуля. Разделение модуля на секции обозначается комментариями. По глобальному контексту и объектам обработчики описываются в порядке их вызовов: Глобальный контекст: ПередНачаломРаботыСистемы() ПриНачалеРаботыСистемы() ПередЗавершениемРаботыСистемы() ПриЗавершенииРаботыСистемы() ОбработкаВнешнегоСобытия() Справочники ПриУстановкеНовогоКода() ПриКопировании() ОбработкаЗаполнения() ПередЗаписью() ПриЗаписи() ПередУдалением() Документы ПриУстановкеНовогоНомера() 6 ПриКопировании() ОбработкаЗаполнения() ПередЗаписью() ПриЗаписи() ПередУдалением() ОбработкаПроведения() ОбработкаУдаленияПроведения() 2.2.2 Блоки модуля При значительном количестве строк модуля и для удобства просмотра модуль может быть разбит на блоки. Блок - более «мелкая единица» модуля, чем секция. Например, в секции обработчиков событий, вызываемых из элементов форм, могут быть выделены блоки: «Обработчики событий командной панели», «Обработчики событий элементов управления», «Обработчики событий формы». В случае необходимости обозначить блок модуля, это следует делать таким образом: Пример обозначения блока модуля //////////////////////////////////////////////////////////////////////////////// // ЗАГОЛОВОК БЛОКА // // Первый абзац описания блока модуля // продолжение первого абзаца описания блока модуля // В модулях могут быть назначены блоки с такими названиями: //////////////////////////////////////////////////////////////////////////////// // ЭКСПОРТНЫЕ ПРОЦЕДУРЫ // //////////////////////////////////////////////////////////////////////////////// // ПЕРЕМЕННЫЕ МОДУЛЯ // //////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ И ФУНКЦИИ // //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ // //////////////////////////////////////////////////////////////////////////////// // ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ // Могут быть добавлены и другие блоки. 2.2.3 Заголовок модуля Модуль может иметь заголовок - описание модуля, которое располагается до секции объявления переменных модуля. В общем случае, заголовок модуля может включать следующие разделы: обзор - объяснение, зачем этот модуль был написан и общие принципы его работы; особые условия работы модуля. 2.3 Тексты модулей 7 2.3.1 Тексты модулей Тексты модулей оформляются по принципу «один оператор в одной строке». Наличие нескольких операторов допускается только для «однотипных» операторов присваивания, например: А = 0; Б = 0; С = 0; Текст модуля должен быть оформлен синтаксическим отступом. Для синтаксического отступа следует использовать табуляцию, а не пробелы, чтобы при смене числа знаков в табуляции выравнивание текста сохранялось. С крайней левой позиции должны начинаться только: операторы Процедура, КонецПроцедуры, Функция, КонецФункции; операторы предварительного объявления процедур и функций; заголовки процедур и функций; операторы объявления глобальных переменных модуля; операторы «раздела основной программы» (с учетом синтаксического отступа). Внимание! Ключевые слова пишутся канонически (как в документации или Синтакс Помощнике), например: правильно: КонецЕсли неправильно: конецЕсли, КОНЕЦЕСЛИ, конецесли, Конецесли. При длине строки более 80 символов следует использовать переносы. Не следует делать строки длиннее 120 символов, за исключением тех случаев, когда перенос невозможен по каким-либо веским соображениям. При переносах отступ от начала строки делается следующим образом: сначала ставится такое же количество табуляций, какое было использовано в первой строке для соблюдения синтаксического отступа; затем строка «отгоняется» на нужную позицию пробелами. 2.3.2 Перенос параметров при вызове процедур, функций, методов Параметры процедур, функций, методов (при необходимости) переносятся следующим образом: каждый параметр начинается с новой строки; все параметры выравниваются по началу первого параметра; закрывающая скобка и разделитель операторов «;» пишутся в той же строке, что и последний параметр. Пример: СписокВидов = Новый СписокЗначений; СписокВидов.Добавить(Метаданные.Документы.СтрокаВыпискиРасход.Имя, Метаданные.Документы.СтрокаВыпискиРасход.Синоним); СписокВидов.Добавить(Метаданные.Документы.РасходныйКассовыйОрдер.Имя, Метаданные.Документы.РасходныйКассовыйОрдер.Синоним); 2.3.3 Перенос условий в Если…КонецЕсли Сложные логические условия в Если…КонецЕсли, состоящие из большого числа выражений (но это само по себе - плохо) переносятся следующим образом: каждое условие пишется на отдельной строке: логические операторы И, ИЛИ ставятся ПЕРЕД условием; все условия выравниваются по началу первого условия, без учета логического оператора; Тогда пишется на той же строке ,что и последнее условие. Пример: 8 Если (ВидОперации = Перечисления.ВидыОперацийПоступлениеМПЗ.ПоступлениеРозница) ИЛИ (ВидОперации = Перечисления.ВидыОперацийПоступлениеМПЗ.ПоступлениеРозницаКомиссия) Тогда Возврат Истина; КонецЕсли; 2.3.4 Перенос выражений Длинные арифметические выражения переносятся следующим образом: в одной строке может находиться более одного операнда; знаки операции пишутся ПЕРЕД операндом (а не в конце предыдущего операнда); операнды выравниваются по началу первого операнда, без учета знаков операций. Пример: ВременнаяСтрока = ВременнаяСтрока + ", НП (в т. ч.): " + обФорматСумм(Спецификация.Итог("СуммаНП")); 2.4 Оформление конструкций встроенного языка 2.4.1 Общие требования Следует отделять друг от друг пробелами: ключевые слова; вызовы процедур и функций параметры процедур и функций внутри скобок; операторы; имена переменных; константы; знак «=», знаки арифметических операций «+»,«-»,«*», «/»; и другое - будет уточняться в процессе. 2.4.2 Выравнивание операторов присваивания При следовании друг за другом нескольких «однотипных» операторов присваивания, допускается выравнивать их следующим образом: Длг.ПолноеИмяФайла Длг.Каталог Длг.Заголовок Длг.Фильтр Длг.Расширение = = = = = ИмяФайла; ИмяПути; "Выберите файл со списком запросов"; "Файлы запросов (*.sel)|*.sel|Все файлы (*.*)|*.*"; "sel"; 2.5 Процедуры и функции 2.5.1 Заголовки процедур и функций (кроме обработчиков) Процедуры и функции (кроме обработчиков) должны предваряться заголовком. Заголовок имеет целью пояснить назначение и использование функции (процедуры). Заголовок размещается перед объявлением процедуры (функции). Заголовок имеет следующий формат (рекомендуемо): 9 // Первый абзац описания процедуры (функции) // продолжение первого абзаца описания процедуры (функции) // // Второй и последующие абзацы описания процедуры (функции) // продолжение второго и последующих абзацев описания процедуры (функции) // // Параметры: // ПараметрОдин – Тип.Вид – описание параметра. // продолжение описания параметра. // ПараметрДва – Тип.Вид – описание параметра. // продолжение описания параметра. // // Возвращаемое значение: // Нет. Процедура или Функция ИмяПроцедурыФункции(ПараметрОдин, Знач ПараметрДва, ПараметрТри=0,…) <пустая строка> Перем Переменная1; <пустая строка> Операторы; <пустая строка> КонецПроцедуры или КонецФункции // ИмяПроцедурыФункции() <пустая строка> Настоятельно рекомендуется в заголовках не превышать длину строки в 80 символов. 2.5.2 Обработчики событий Обработчики событий сводятся в одну секцию модуля. Обработчики событий должны иметь секцию «Описание». Описание размещается в соответствии с общими требованиями к заголовкам процедур, перед объявлением процедуры обработчика. Первый абзац описания обработчика события должен включать фразу: // Обработчик события <имя события> <вид реквизита/объекта> <имя реквизита/объекта>. Описание может пояснять выполняемые в обработчик действия. Пример описания обработчика события // Обработчик события ПриВыводеСтроки табличной части Спецификация. // Формирует данные в колонке "Всего". // Процедура СпецификацияПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) <пустая строка> Перем Переменная1; <пустая строка> Операторы; <пустая строка> КонецПроцедуры // СпецификацияПриВыводеСтроки() 2.6 Переменные 2.6.1 Оформление переменных глобального и общих модулей В глобальном и общих модулях все переменные модуля должны быть полностью и единообразно закомментированы, таким образом, чтобы являть собой достаточное и легко читаемое описание. Описание следует в той же строке, что и объявление переменной, через некоторое количество пробелов. 10 Перем Перем Перем Перем глДа Экспорт; глНет Экспорт; глДоллары Экспорт; глРазделительТриад Экспорт; // // // // Перечисление.Булево.Да Перечисление.Булево.Нет Справочник.Валюты.Доллары Строка[1] (например "'") 2.7 Комментарии 2.7.1 Комментарии Комментарии занимают отдельную строку или несколько строк. Он должны располагаться ПЕРЕД комментируемым оператором или группой операторов. При длине строки более 80 символов можно начинать делать переносы. Строки не должны быть длиннее 120 символов. 2.7.2 Содержание и оформление комментариев Комментарии должны быть достаточно пространными, чтобы пояснять работу комментируемого оператора (операторов) или назначение объявляемой переменной. Текст комментария должен быть формальным, не содержать эмоций и слэнга. Названия процедур и функций в комментариях приводятся так, как они написаны в коде. Неправильно: // Вызывается из "при открытии" этой формы и из "после записи" формы счетафактуры. Правильно: // Вызывается из обработчика ПриОткрытии этой формы и из обработчика ПослеЗаписи формы счета-фактуры. 3. Правила разработки конфигураций и использования конструкций встроенного языка 3.1 Порядок записи движений документов Применение явной записи наборов записей регистров (с помощью метода Записать()) в процедурах обработки проведения документов запрещено. Запись должна производится неявно системой, в момент выхода из транзакции. Данное ограничение обусловлено необходимостью соблюдать во всех документах строго одинаковую последовательность записи регистров, что достаточно трудоемко. В случае же нарушения этого правила, при параллельной работе нескольких пользователей, возможна ситуация возникновения взаимных блокировок (“deadlock’ов”) при проведении документов. Исключением может быть ситуация, когда данные, сохраняемые в регистрах, необходимы в последующих алгоритмах, выполняемых до момента выхода из процедуры проведения. 3.2 Получение представлений для ссылочных значений в табличном документе При формировании табличного документа запрещено в качестве параметров ячеек с типом заполнения "Параметр" указывать ссылочные значения. Поскольку в этом случае в момент вывода в табличный документ системой будет выполнено многократное обращение к базе данных для получения представлений этих значений. Поэтому в качестве параметров следует указывать сами представления. 11 Исключением могут быть случаи, когда для получения представлений придется выполнять аналогичное многократное обращение к базе данных. 3.3 Обращение к базе данных в обработчиках часто вызываемых событий Следует минимизировать обращение к базе данных в обработчиках событий из списка ниже. Поскольку это может существенно замедлить интерактивную работу с системой. Список событий формы: - ОбновлениеОтображения; Список событий табличного поля: - ПриВыводеСтроки; - ПриАктивацииСтроки. В качестве средств минимизации в зависимости от ситуации могут быть: - использование переменных модуля формы для кэширования данных, - перенос операций в обработчики других событий, - для таблиц значений - получение необходимых данных на этапе заполнения, - любые другие методы. 3.4 Интерактивный поиск в табличном поле В тех случаях, когда в табличном поле нединамического списка (например, таблицы значений) осуществляется поиск определенной строки по подстроке, системой генерируется событие ПриВыводеСтроки() для всех строк между текущей и искомой. Кроме этого, если колонка, по которой осуществляется поиск, содержит ссылочные значения, выполняется многократное обращение к БД для получения представлений для этих значений. Что достаточно сильно замедляет поиск, особенно в файловой версии. Поэтому, в таких случаях рекомендуется применять следующий метод: - при заполнении источника данных для табличного поля получать отдельно как ссылочные значения, так и их представления. - в событии "При выводе строки" для ячеек колонки с ссылочными значениями устанавливать в качестве текста полученное строковое представление Например: Процедура ТабличноеПолеПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) ОформлениеСтроки.Ячейки.Номенклатура.УстановитьТекст( ДанныеСтроки.НоменклатураПредставление); КонецПроцедуры В случае использования этого метода, получение ссылок при поиске выполняться не будет. В результате выполнение поиска при тех же условиях занимает менее одной секунды. Данную методику возможно не применять в ситуациях, когда количество строк в рассматриваемой таблице значений, с высокой вероятностью не превысит нескольких десятков. 3.5 Многократное выполнение однотипных запросов При выполнении серии даже достаточно простых однотипных запросов, следует учитывать, что для каждого запроса из этой серии при его выполнении будет проводиться сбор информации, для проверки его правильности. На что в конфигурациях, содержащих большое количество объектов метаданных может затрачиваться достаточно заметное время. Для того чтобы избежать подобного эффекта рекомендуется, в зависимости от ситуации, выполнять получение необходимых данных одним запросом, применять системные методы (НайтиПоКоду(), НайтиПоНомеру() и т.д.) или любые другие способы. 3.6 Приведение значений измерений составного типа записей регистров Значения измерений в записях регистров, имеющих составной тип, и при этом содержащих в качестве значений пустое значение, перед записью должны приводиться к значению "Неопределено". 12 Под пустым значением подразумевается значение по умолчанию для данного типа - пустая ссылка для ссылочного типа данных; пустая строка, 0, Ложь, Дата('00010101') для соответствующих базовых типов. Данное правило обусловлено тем, что при получении итогов по данному регистру, итоги по таким значениям не суммируются. Например, пусть определен регистр накопления, у которого одно из измерений имеет составной тип ("Справочник1", "Справочник2"), тогда возможна ситуация, когда итоги по этому регистру будут содержать три значения по пустому значению этого измерения - по пустой ссылке "Справочник1", по пустой ссылке "Справочник2", а также по значению "Неопределнено". Методика приведения таких значений к "Неопределено" не регламентируется - это может быть как универсальная процедура проверки и замены, вызываемая в обработчике события "Перед записью" набора записей регистра, так и специальная процедура заполнения набора записей из промежуточной таблицы значений. 3.7 Использование строковых реквизитов неограниченной длины в объектах Запрещается использовать для хранения информации, объем которой может быть достаточно большим, непрогнозируемым, и при этом заведомо неограниченным, реквизиты объектов, имеющих тип строка неограниченной длины. Поскольку при больших объемах сохраненной таким образом информации, значительно замедляется выполнение различных операций с этим объектом (таких как открытие формы объекта, пометка удаления, использование методов ПолучитьОбъект(), Прочитать() и т.д.) 3.8 Пометка удаления подчиненных документов (справочников) В случае установки / снятия пометки удаления для документа (справочника), аналогичные действия должны быть выполнены для всех документов (справочников), логически подчиненных данному. Исключения составляют случаи, когда данные действия отрабатываются платформой. Документ (справочник) считается логически подчиненным, если существует способ, с помощью которого возможно установить однозначную связь "родитель-подчиненный" между объектами. Это может быть связь через реквизит объекта (например, для подчиненного документа реквизит "ДокументОснование") или любой другой способ. При этом не следует руководствоваться только этим правилом - объекты также должны быть логически взаимосвязаны друг с другом. Разработчик прикладного решения должен самостоятельно, исходя из методических соображений, определить документы (справочники) для которых необходимо применять данный стандарт. Примером такого подчиненного объекта может служить документ "Счет-фактура (полученный)", логически подчиненный документу "Поступление товаров". Или элемент справочника "Контактные лица", логически подчиненный справочнику "Контрагенты" и т.д. Соответствующая процедура установки / снятия пометки удаления должна вызываться в обработчике события "При записи" в случае успешной записи объекта-основания. 3.9 Использование "ОБЪЕДИНИТЬ" и "ОБЪЕДИНИТЬ ВСЕ" в запросах В общем случае, при объединении в запросе результатов нескольких запросов следует использовать конструкцию "ОБЪЕДИНИТЬ ВСЕ", а не "ОБЪЕДИНИТЬ". Поскольку во втором варианте, при объединении запросов полностью одинаковые строки заменяются одной, на что затрачивается дополнительное время, даже в случаях, когда одинаковых строк в запросах заведомо быть не может. Исключением являются ситуации, когда выполнение замены нескольких одинаковых строк одной является необходимым условием выполнения запроса. 13 3.10 Работа с использованием сервера 1С:Предприятие 8.0 и в режиме внешнего соединения При разработке кода общего модуля и модулей объектов, которые должны быть доступны на сервере и во внешнем соединении, следует соблюдать следующие правила. Общее: Запрещено использование объектов, имеющих тип данных, недоступный на сервере и во внешнем соединении: - ТабличныйДокумент, - ТекстовыйДокумент, - ДиалогВыбораФайла, - все другие типы, использование которых невозможно на сервере 1С:Предприятие и во внешнем соединении. Запрещено использование средств, отвечающих за диалог с пользователем: - Предупреждение(), - Вопрос(), - методы работы с формами и прочие, для которых специально указано (в документации), что не доступны на сервере и/или во внешнем соединении. Исключением является метод Сообщить(). Запрещается вызов экспортных процедур других общий модулей, у которых не установлен признак компиляции на сервере и во внешнем соединении. Участки кода, в которых используются конструкции не доступные на сервере или во внешнем соединении, должны выделяться соответствующими операторами препроцессора (#Если Клиент:). При написании кода модулей объектов, наборов записей или модуля менеджера значения константы, которые исполняются на сервере или доступны во внешнем соединении, недопустимо использовать переменные, процедуры и функции, которые определены в модуле приложения. Использование сервера 1С:Предприятие: Надо учитывать, что при передаче управления с клиента на сервер, а также в обратную сторону существует ограничение на тип передаваемых параметров. Поэтому в качестве параметров процедур, а также возвращаемых значений функций, выполняемых на сервере, следует использовать значения примитивных типов, ссылки на объекты базы данных, системные перечисления, уникальный идентификатор, результат запроса, хранилище значения, таблицу значений, массив, структуру и соответствие. При передаче в содержимом указанных коллекций допускаются также только перечисленные типы. Во внешнем соединении: Текст модулей объектов следует писать таким образом, чтобы при работе во внешнем соединении (в частности, при работе WEB-приложения), обеспечивалась работоспособность всей прикладной логики, с учетом того, что часть объектов недоступна для использования во внешнем соединении, например использование средств диалога с пользователем. Недопустимо размещать в общих модулях процедуры и функции, которые недоступны во внешнем соединении, и без которых невозможна запланированная методика использования и работы объектов. 4. Свойства объектов метаданных 4.1 Общие требования к имени, синониму, комментарию Имя объекта надо стремиться строить на основе синонима объекта так, как это делает система автоматически: пробелы и пр. недопустимые символы удаляются, первые буквы слов делаются заглавными (при этом следует исключать префикс объекта). 14 Для реквизитов объектов допускается переставлять слова из синонима местами, например: синоним «Полное наименование», имя «НаименованиеПолное». Для ведущих объектов подобное не допускается. Синоним объекта должен быть определен так, чтобы осмысленно описывать объект. Сокращения допускаются только общепринятые, например, «ОКЕИ», «ИНН». Для ведущих объектов метаданных необходимо стремиться к тому, чтобы название объекта в меню, подпись в диалоговых формах совпадали с синонимом или, как минимум, начинались с него. Для форм синоним должен начинаться со слов, генерируемых конструктором при создании формы («Форма списка…», «Форма элемента…» и т. д.), далее, в случае наличия нескольких форм одного назначения, обязательно должно следовать уточнение, например «Форма элемента полная», «Форма элемента упрощенная». Комментарий задается только в тех случаях, когда необходимы какие-либо пояснения. Если в синониме использовано сокращение, в комментарии необходимо его расшифровать, например: «Общероссийский классификатор единиц измерения». Для реквизитов объектов в комментариях в необходимых случаях должно содержаться уточнение, например: «Сумма со всеми налогами». 4.2 Общие требования к типам (реквизитов и пр.) Числовой тип: ограничения могут быть следующие: • Реквизиты типа флаг (0/1) не делаем, применяем булев тип данных. • Реквизиты типа сумма: длина 19, точность 2. • Реквизиты типа количество: длина 19, точность 3. • Реквизиты типа коэффициент: длина 15, точность 3. • Реквизиты типа курс: длина 15, точность 4. • Реквизиты типа процент: длина 5, точность 2. Строковый тип: • Допустимая длина должна быть в большинстве случаев переменной – это означает, что при получении значения реквизита из него автоматически будут удаляться пробелы справа. • Неограниченная длина должна назначаться, если: • Не требуется поиск, отбор и т. д. по реквизиту (т. к. поиск работать не будет ни в каком виде) • Реквизит часто может быть не заполнен, или количество символов больше 100 (т. к. строки неограниченной длины хранятся порциями, а пустые места не занимают совсем). 4.3 Общие требования к ведущим объектам Сортировка: ведущие объекты в дереве метаданных сортируются по представлению по возрастанию – это облегчает их выбор в режиме «1С:Предприятие» в системных формах выбора вида объекта. Принадлежность к подсистемам: обязательно должна быть указана принадлежность объекта к конкретным подсистемам. Не следует задавать принадлежность всей конфигурации. Включение справочной информации в содержание помощи: для ведущих объектов метаданных справочная информация включается в содержание помощи. 4.4 Общие требования к реквизитам и табличным частям объектов Индексирование: индексировать реквизиты следует в тех случаях, если по ним предполагается выполнять сортировку, или если по реквизиту часто выполняется отбор, поиск и т. д. Отбор и поиск будут работать и без индексирования, но медленнее. Следует помнить, что индексирование снижает скорость записи и увеличивает объем базы 15 4.5 Справочники Иерархический Вид иерархии Ограничивать количество уровней: если справочник иерархический – не ограничивать, за исключением справочников, заведомо могущих содержать небольшое количество. Количество уровней: определяется предназначением справочника, определяется разработчиком. Размещать группы сверху Владельцы назначаются в соответствии с проектной логикой. Длина кода, если не определяется проектной логикой, должна быть фиксированной: 5 символов. Считаем, что этого достаточно для любого справочника любой типовой конфигурации. При наличии префиксации длина кода увеличивается на допустимую длину префикса (на 3 символа). Длина наименования. Следует избегать завышенной длины наименования, поскольку оно в большинстве случаев является основным представлением и должно занимать «умеренное» количество места в диалоговых формах. Для большего порядка предлагается пользоваться вариантами: • 25 для «небольших» справочников. • 50 для тех справочников, кому 25 мало. • 100 для тех справочников, кому 50 мало. Тип кода, если не определяется проектной логикой, назначается «Строка». Серии кодов, если не определяются проектной логикой, назначаются «Во всем справочнике». Контроль уникальности, если не определяется проектной логикой, должен быть включен. Авто нумерация, если не определяется проектной логикой, должна быть включена. Основное представление, если не определяется проектной логикой, должно быть «В виде наименования». Способ редактирования надо назначать по следующим правилам: • «В списке» – если справочник не имеет большого количества реквизитов и пр. особенностей, при которых желательно иметь форму элемента. • «Обоими способами» – если разработана форма элемента, желательно все равно поддерживать режим редактирования (видимых реквизитов) в списке, поскольку так во многих случаях быстрее, просматривая список, что-либо поправить. Допустимо вводить ограничения, например, для ввода нового вызывать форму элемента. • «В диалоге» – только в случаях, когда запрет редактирования в списке серьезно обоснован. Основная форма элемента должна быть назначена, если допускается редактирование в диалоге или открытие элемента из полей ввода (по кнопке «Открыть»). Основная форма группы должна быть назначена, если справочник многоуровневый и допускается редактирование в диалоге или открытие группы из полей ввода (по кнопке «Открыть»). Может совпадать с формой элемента, если большинство реквизитов у группы и элемента совпадают (в этом случае в форме надо учитывать отличия между элементом и группой, если они имеются). Основная форма списка должна быть назначена всегда. Основная форма для выбора должна быть назначена всегда. Должна отличаться от формы списка, только если есть необходимость в существенных отличиях форм списка и выбора. 4.6 Нумераторы документов Сортировка: нумераторы в дереве метаданных сортируются по имени по возрастанию. Принадлежность к подсистемам: обязательно должна быть указана принадлежность нумератора к конкретным подсистемам. Не следует задавать принадлежность всей конфигурации. 16 Тип номера, если не определяется проектной логикой, назначается «Строка». Длина номера, если не определяется проектной логикой, должна быть фиксированной: 5 символов. Считаем, что этого достаточно для любого документа любой типовой конфигурации. При наличии префиксации длина номера увеличивается на допустимую длину префикса (на 3 символа). Периодичность номера, если не определяются проектной логикой, назначаются «Год». Контроль уникальности номера, если не определяется проектной логикой, должен быть включен. 4.7 Документы Авто нумерация, если не определяется проектной логикой, должна быть включена. Основная форма документа должна быть назначена всегда. Основная форма списка должна быть назначена всегда. Основная форма для выбора должна быть назначена всегда. Должна отличаться от формы списка, только если есть необходимость в существенных отличиях форм списка и выбора. 4.8 Регистры сведений 4.8.1 Регистры сведений Способ редактирования надо назначать по следующим правилам: • «В списке» – если регистр не имеет большого количества реквизитов и пр. особенностей, при которых желательно иметь форму записи. • «Обоими способами» – если разработана форма записи, желательно все равно поддерживать режим редактирования (видимых реквизитов) в списке, поскольку так во многих случаях быстрее, просматривая список, что-либо поправить. Допустимо вводить ограничения, например, для ввода новой вызывать форму записи. • «В диалоге» – только в случаях, когда запрет редактирования в списке серьезно обоснован. Основная форма записи должна быть назначена, если допускается редактирование в диалоге. Основная форма списка должна быть назначена обязательно, если предполагается работа с регистром в интерактивном режиме. Периодичность регистра сведений назначается в соответствии с проектной логикой. Режим записи назначается в соответствии с проектной логикой. 4.8.2 Измерения регистров сведений Сортировка: измерения регистров сведений в дереве метаданных сортируются в соответствии с проектной логикой. Ведущее измерение – назначается в соответствии с проектной логикой. Запрет пустых значений назначается в соответствии с проектной логикой. Индексирование: индексировать следует только те измерения, по которым часто выполняются сортировка, отбор, поиск и т. д. Все это будет работать и без индексирования, но медленнее. Индексирование снижает скорость записи и увеличивает объем базы. 4.9 Регистры накопления 4.9.1 Регистры накопления Вид регистра назначается в соответствии с проектной логикой. Основная форма списка должна быть назначена обязательно, если предполагается работа с регистром в интерактивном режиме. 4.9.2 Измерения регистров накопления 17 Сортировка: измерения регистров сведений в дереве метаданных сортируются в соответствии с проектной логикой. Запрет пустых значений назначается в соответствии с проектной логикой. Индексирование: индексировать следует только те измерения, по которым часто выполняются сортировка, отбор, поиск и т. д. Все это будет работать и без индексирования, но медленнее. Индексирование снижает скорость записи и увеличивает объем базы. 4.10 Отчеты Для создания отчета используется общая форма «ФормаОтчета» из ветки конфигурации Общие/ОбщиеФормы (при встроенном блоке БСП). В случаях, когда нет возможности использовать данную форму, интерфейс формы создается максимально приближенным к ней. 5. Перечень грубых ошибок по платформе v8 Решение должно обеспечивать целостность информационной базы и правильное «отнесение» данных к тем, которые являются частью прикладного решения, и которые не являются его частью. Ошибочным является конфигурирование с использованием внешних файлов для хранения данных задачи, когда их нужно хранить в базе данных. Нельзя на регистрах накопления остатков вести учет ресурсов, принципиально не выводимых в ноль! Ресурсы регистра остатков (один или все) не должны изменяться документами только "в одну сторону" (только в "+" или только в "-"), т.к. в этом случае не обеспечивается выведения остатков ресурсов в "0". Нарушение этого требования приводит к неоправданному "распуханию" таблиц хранения итогов регистров; Нельзя допускать рассогласование по набору измерений при выполнении положительных и отрицательных движений для регистра остатков. Пример: ресурсы регистра остатков (один или все) изменяются документами и в "+" и в "-" но движения с противоположным знаком для одного того же объекта учета выполняются с разными наборами значений измерений, что также не обеспечивает выведения остатков ресурсов в "0". Единственной достоверной информацией в системе учета следует считать информацию регистров. Информация из документов может рассматриваться лишь как вспомогательная и не может быть абсолютно достоверной при условии наличия документа, аналогичного ручной операции 7.7 Конфигурация должна устойчиво работать и при работе пользователей задним числом. Если при проведении документа используются каким-то образом данные, считываемые из регистров, обязательно требуется предусмотреть получение таких данных на момент проведения документа. Крайне неправильно при проведении документа прошлым месяцем ориентироваться на данные, взятые на текущий момент. Месяц назад ведь картина была совсем другой. Конфигурация должна устойчиво работать не только при движении вперед, но и назад. То есть, при отмене действия любого документа состояние показателей, контролируемых системой, должно возвращаться в исходное положение (как было до движений документа). Фактически тогда можно будет размотать всю цепочку документов назад. Ошибочным является стиль программирования, при котором операции, которые правильнее делать в модуле объекта, выполняются в модуле формы. Ошибочным является стиль программирования, при котором получение любых показателей остатков (по бухгалтерским регистрам, по регистрам накопления) производится складыванием оборотов или по реальным таблицам регистра Ошибочным является стиль программирования, при котором допускается выполнение запросов или получение остатков внутри цикла, как неоправданно снижающий скорость работы программы. Ошибочным является стиль программирования, при котором допускается выполнение запросов или получение остатков внутри цикла, как неоправданно снижающий скорость работы программы. 18 Ошибочным является стиль работы с запросами, при котором осуществляется неверный выбор виртуальных таблиц (например ОборотыДтКт вместо Обороты и т.п.), как неоправданно снижающий скорость работы программы. При использовании виртуальных таблиц следует максимально использовать их параметры – для обеспечения максимальной эффективности запросов. Например, в большинстве случаев неэффективным является стиль работы с запросами, при котором вместо использования параметров виртуальных таблиц накладываются условия в разделе "Где". Ошибочным является стиль работы с запросами, при котором без необходимости производится соединение виртуальных таблиц с реальными, как неоправданно снижающий скорость работы программы. Обход результата запроса через промежуточную выгрузку в таблицу значений и последующим поиском, как неоправданно снижающий скорость работы программы. На форме периодического отчета не должна отсутствовать возможность выбора даты или периода при построении. Необходимо избегать ситуации, когда при проведении документа учитывается нечто, кроме как данные самого документа или данные, взятые из регистров на момент проведения документов. Обязательно нужно учитывать возможность изменения "чужих" данных. В случае если Вы учитываете при проведении документа состояние какого-нибудь реквизита некого справочника – есть опасность, что пользователь позже может поменять значение реквизита на совсем другое. Значит, для корректной работы конфигурации надо или запретить изменения таких данных, или как-то отработать этот факт – перепроведением документов или хотя бы предупреждением о возможных коллизиях. Раздел II. Рекомендательные требования. 1. Правила разработки конфигураций и использования конструкций встроенного языка 1.1 Обработчики событий У каждого события должен быть свой обработчик. Если одинаковые действия должны выполняться при изменении разных элементов управления или при нажатии нескольких кнопок (например), в этом случае: создается отдельная процедура (функция), выполняющая необходимые действия; для каждого элемента управления создается отдельный обработчик с именем, назначаемым по умолчанию; из каждого обработчика вызывается требуемая процедура (функция). 1.2 Присвоение результатов функции Вопрос() При использовании функции встроенного языка Вопрос() необходимо результат работы функции предварительно присваивать переменной Ответ и сравнивать уже эту переменную. 1.3 Использование таймаутов в модальных диалогах Таймауты в модальных диалогах (в частности в методах Вопрос(), Предупреждение()) не используются. 1.4 Установка отбора в запросах с помощью вложенных запросов В тех случаях, когда для фильтрации результатов запроса применяется оператор «В» со списком значений, и размер этого списка в некоторых случаях использования может быть достаточно большим следует использовать вложенный запрос, против явного указания элементов списка. 19 1.5 Использование свойств ЭтотОбъект, ЭтаФорма В тех случаях, когда в модуле формы присутствует обращение к свойству или методу этой формы, не следует использовать для этого конструкцию ЭтаФорма. Неправильно: Если ЭтаФорма.ВладелецФормы <> Неопределено Тогда... Правильно: Если ВладелецФормы <> Неопределено Тогда... Данное свойство предназначено только для получения самой формы, например для передачи ее в качестве параметра в другие формы, процедуры, функции. Также этого правила необходимо придерживаться и при использовании свойства ЭтотОбъект. 1.6 Использование общей формы индикации выполнения процесса В случаях использования элемента управления «Индикатор» для отображения выполнения длительного процесса, его следует отображать, используя отдельную форму. Не рекомендуется отображение индикатора на рабочей форме, из которой был вызван этот процесс. В общих случаях, для исключения дублирования в конфигурации одинаковых форм, и учитывая, что форма индикатора чаще всего имеет один и тот же вид, рекомендуется использовать одну, единую для всех «Общую форму». 1.7 Сортировка строк таблиц значений В тех случаях, когда для таблицы значений применятся сортировка по колонкам, содержащим ссылочные значения, необходимо учитывать, что при этом для каждой из этих колонок для всех строк таблицы значений системой будет выполнено обращение к ИБ за представлением этой ссылки. Поэтому, для таблиц с большим количеством (несколько сотен и тысяч) строк, особенно в алгоритмах критических ко времени исполнения, рекомендуется сразу, на этапе заполнения добавлять в таблицу дополнительные колонки с представлениями, и сортировку выполнять уже по ним. Если, конечно, это не вызовет аналогичных многократных обращений к ИБ. 1.8 Получение представлений для ссылочных значений При получении представления для ссылочного значения (например, справочника) необходимо использовать конструкцию вида: Строка(Ссылка) или любое другое явное или неявное приведение ссылочного значения к строковому, чем конструкцию вида: Ссылка.Наименование Поскольку во втором случае системой выполняется чтение из ИБ всего объекта целиком, в первом же случае читается только его представление. При этом надо учитывать, что при применении второго метода все реквизиты прочитанного объекта сохраняются в кэше. И в случае последующего обращения к ним чтения из базы не происходит. (Если конечно обращение происходит в течение короткого времени). В случае же если было прочитано только представление, для получения значения какого-либо реквизита системе придется выполнить повторное чтение из ИБ. Поэтому первый метод следует применять только в тех случаях, когда для ссылки необходимо получать только представление. Данный механизм не должен использоваться, когда ссылочные значения получены запросом. В этом случае представления должны получаться непосредственно самим запросом. 1.9 Получение метаданных объектов 20 В тех случаях, когда осуществляется получение метаданных какого-либо объекта конфигурации, следует выполнять его с помощью метода Метаданные(), а не обращаться к свойству глобального контекста Метаданные, т.к. второй способ существенно более медленный. Правильно: СправочникОбъект.Метаданные() Неправильно: Метаданные.Справочники[ИмяСправочника] 1.10 Установка текста в ячейках табличного поля В случаях необходимости задания текста ячеек в колонках табличного поля при выводе строки следует использовать метод УстановитьТекст(). Правильно: ОформлениеСтроки.Ячейки.ИмяКолонки.УстановитьТекст(Текст); Неправильно: ОформлениеСтроки.Ячейки.ИмяКолонки.ОтображатьТекст = Истина; ОформлениеСтроки.Ячейки.ИмяКолонки.Текст = Текст; 1.11 Сравнение с логической константой Результат функции (значение переменной), возвращающей логическое значение, не следует проверять путем сравнения с логической константой. Неправильно: Если ЭтоНовый() = Истина Тогда Правильно: Если ЭтоНовый() Тогда Исключением может быть ситуация, когда функция (переменная) может возвращать не только логическую константу, но и другие значения, например, Неопределено или Null. 1.12 Обращение к свойству ТекущаяСтрока табличного поля. Запрещается использовать свойство ТекущаяСтрока для получения значений отдельных колонок строки табличного поля. Обращение к данным значениям должно выполняться через ТекущиеДанные или ДанныеСтроки. При этом следует учитывать, что для динамических списков в обычных условиях возможность обращения к значениям отдельных колонок с помощью свойства ТекущиеДанные зависит от видимости этих колонок в списке. Поэтому, необходимо явно добавлять данные колонки в источник данных табличного поля перед открытием формы. Данное правило не относится к полям, необходимым для функционирования динамических списков и расширений табличного поля (т.н. системные поля, например "ПометкаУдаления", "ЭтоГруппа", "Дата" и т.д.). Системные поля являются всегда доступными и не удаляются табличным полем из коллекции колонок динамического списка при изменении видимости или удалении колонок табличного поля. 1.13 Правила работы с последовательностями 21 При регистрации документа в последовательности, а также при записи движений документа по регистрам, влияющих на эту последовательность, платформой выполняется блокировка границы последовательности, что отрицательно сказывается на пропускной возможности системы при одновременном вводе документов. Для снижения последствий такого поведения следует применять данную методику. Для документов, входящих в одну последовательность и удовлетворяющих следующим условиям: - с высокой степенью вероятности возможно одновременное проведение несколькими пользователями документа в оперативном режиме - движения по регистрам, влияющие на последовательность, данным документом могут, как выполняться, так и не выполняться при проведении в зависимости от некоторого параметра следует придерживаться следующего правила: 1. Для всех документов, удовлетворяющим вышеописанным условиям, следует в метаданных документа установить значение свойства "Заполнение последовательностей" в "Не заполнять автоматически". 2. Регистрацию документа в последовательности выполнять программным путем в случаях, когда этот документ при проведении выполняет движения по регистрам, влияющих на последовательность. 3. В случаях, когда таких движений не выполняется, документ в последовательности не регистрировать. 4. Изменение границы последовательности выполнять программным путем: - сдвигать границу последовательности вперед при выполнении специальной процедуры восстановления последовательности; - сдвигать границу последовательности назад при проведении документа в неоперативном режиме, в случае, если позиция документа находится ранее границы этой последовательности; - сдвигать границу последовательности назад при отмене проведения документа, в случае, если позиция документа находится ранее границы этой последовательности. Для документов, проводимых в оперативном режиме, границу последовательности изменять не следует, поскольку сам факт оперативного проведения подразумевает, что назад граница сдвинуться не может. Следует учитывать, что при использовании данного механизма, восстановить последовательность средствами платформы уже не получится. Поскольку не все документы в этой последовательности будут зарегистрированы. Поэтому восстановление последовательности следует выполнять отдельной специальной обработкой. Соблюдение данных правил позволит значительно увеличить пропускную способность системы при одновременном оперативном проведении документов несколькими пользователями в режиме, когда данный документ не выполняет движений, влияющих на последовательность. В качестве примера можно привести следующую ситуацию. Существуют документы "Приходная" и "Расходная", выполняющие движения по регистру "Партионный". Также определена последовательность, в которую входит документ "Расходная", и на которую влияют движения по регистру "Партионный". Кроме этого, выполнение движений по регистру "Партионный" документом "Расходная" может выполняться как при его проведении, так и выполняться впоследствии другими средствами, в зависимости от некоторого параметра учета. Соответственно для данного примера будет правильно использовать вышеописанный механизм для документа "Расходная". Что позволит, при использовании режима, когда документ "Расходная" не выполняет движения при проведении по регистру "Партионный", избежать блокировки границы последовательности при оперативном проведении этого документа, тем самым увеличив пропускную способность системы. 1.14 Использование конструктора объекта "ОписаниеТипов" При создании нового объекта "ОписаниеТипов", содержащего только один тип, тип следует определять с помощью строкового значения, а не массива. Если, при этом требуется описание квалификаторов, соответствующие конструкторы также вызываются в качестве параметров конструктора объекта "ОписаниеТипов". В случае, если объект "ОписаниеТипов" будет содержать несколько типов, выбор варианта реализации остается на усмотрение разработчика. 1.15 Использование объекта РегистрСведенийМенеджерЗаписи 22 Объект РегистрСведенийМенеджерЗаписи следует применять только в случаях, когда выполнение операций с регистром требует использования отбора одновременно по всем измерениям. В остальных случаях следует использовать РегистрСведенийНаборЗаписей. Поскольку, при его использовании любая операция (запись или чтение) выполняется одновременно для всех записей набора, а не для каждой в отдельности. Поэтому данный метод заведомо эффективнее. РегистрСведенийНалорЗаписей не запрещено применять так же для записи одной записи, когда установлены отборы по всем измерениям. 1.16 Использование фильтра в запросах для полей составного типа При установке ограничения на выборку в запросе с помощью фильтра по значению поля составного типа не рекомендуется использовать конструкцию "В (&СписокЗначений)", если при этом в списке присутствуют значения различных типов. Поскольку в этом случае, при выполнении запроса не задействуются индексы, из-за чего время выполнения может значительно увеличиться. Эффективнее выполнять объединение (с помощью "ОБЪЕДИНИТЬ ВСЕ") отдельных запросов для каждого значения из данного списка. Неправильно: ВЫБРАТЬ Объект, Тип, Вид ИЗ РегистрСведений.КонтактнаяИнформация ГДЕ Объект В (&СписокОбъектов) Правильно: ВЫБРАТЬ Объект, Тип, Вид Из регистрСведений.КонтактнаяИнформация ГДЕ Объект = &Контрагент ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Объект, Тип, Вид Из регистрСведений.КонтактнаяИнформация ГДЕ Объект = &КонтактноеЛицо В примере предполагается, что "СписокОбъектов" содержит значения "Контрагент" и "КонтактноеЛицо". При достаточно большом количестве записей (более ста тысяч) в приведенном регистре сведений, время выполнения запроса первого примера превышает время второго в три раза для клиентсерверной версии, и в несколько десятков раз для файловой. 1.17 Использование в запросах виртуальной таблицы «ОстаткиИОбороты» При необходимости одновременного получения в запросе значения оборота за период по какомулибо ресурсу регистра, а также остатков на начало, либо на конец этого периода (например, "Приход, Расход и КонечныйОстаток" или "НачальныйОстаток, Приход" и т.д., важно только, что остаток необходим именно только на одну из границ периода) рекомендуется использовать соединение таблицы остатков с таблицей движений по этому регистру вместо использования таблицы ОстаткиИОбороты, поскольку первый метод является более быстрым (при больших объемах информации - в несколько раз). Неправильно: ВЫБРАТЬ Товары.Ссылка, ТаблицаРегистров.КоличествоКонечныйОстаток, ТаблицаРегистров.КоличествоПриход ИЗ Справочник.Номенклатура КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&НачГраница, &КонГраница, Месяц, , Номенклатура = &Номенклатура) КАК ТаблицаРегистров 23 ПО ТаблицаРегистров.Номенклатура = Товары.Ссылка ГДЕ Товары.Ссылка = &Номенклатура Правильно: ВЫБРАТЬ Товары.Ссылка, ТаблицаРегистраОстатки.КоличествоОстаток, ТаблицаРегистра.Количество ИЗ Справочник.Номенклатура КАК Товары ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&КонГраница, Номенклатура = &Номенклатура) КАК ТаблицаРегистраОстатки ПО ТаблицаРегистраОстатки.Номенклатура = Товары.Ссылка ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах КАК ТаблицаРегистра ПО ТаблицаРегистра.Номенклатура = Товары.Ссылка И ТаблицаРегистра.Период МЕЖДУ &НачГраница и &КонГраница И ТаблицаРегистра.Активность ГДЕ Товары.Ссылка = &Номенклатура 1.18 Выгрузка результата запроса в список значений В случае необходимости выгрузки результата запроса (значений одного поля результирующей таблицы запроса) в список значений следует применять промежуточную выгрузку и последующую загрузку значений из массива, против последовательного перебора выборки из результата запроса. Поскольку первый метод является более быстрым (при большом количестве элементов в списке - в несколько раз). Неправильно: Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ИскомыйСписок.Добавить(Выборка.Склад); КонецЦикла; Правильно: Запрос.Текст = "ВЫБРАТЬ Ссылка КАК Склад ИЗ Справочник.Склады"; ИскомыйСписок.ЗагрузитьЗначения(Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Склад") ); 2. Работа с запросами 2.1 Оформление текстов запросов 1. Все ключевые слова языка запросов пишутся заглавными буквами. 2. Необязательные конструкции запроса в типовых конфигурациях желательно указывать в целях повышения наглядности текста запроса и «устойчивости» использующего его кода. Пример Если в алгоритме используется запрос с полем, объявленным как 3. Касса.Валюта при изменении имени реквизита нужно будет также изменить и код, осуществляющий обращение по имени свойства Валюта к выборке из результата запроса. Если же поле будет объявлено как Касса.Валюта КАК Валюта то изменение имени реквизита приведет только к изменению текста запроса. 24 4. Особенно внимательно следует относиться к автоматически присваиваемым псевдонимам для полей – реквизитов других полей, типа Касса.Валюта.Наименование. В приведенном выше примере поле получит автоматический псевдоним ВалютаНаименование, а не Наименование. 5. Некоторые из необязательных конструкций в текстах запросов типовых конфигураций указываться обязательно: ключевое слово КАК перед псевдонимом поля, источника. 6. Текст запроса должен быть структурирован, не следует писать запрос в одну строку, даже короткий. Вообще следует уделить достаточное внимание наглядности текста запроса, поскольку это существенно улучшает его понимание другими разработчиками. В тех случаях, когда текст запроса составляется из нескольких частей в модуле, также рекомендуется придерживаться этого правила. Необходимо использовать синонимы полей запросов, в тех случаях, когда имя поля запроса не следует явно из имени поля таблицы. Другими словами не допускается автоматическая генерация имени поля, кроме явных случаев. Так же не допускается автоматическая генерация имени поля типа «Номенклатура1», т.е. когда имя поля запроса не уникально ему тоже обязательно присвоить синоним. 2.2 Конструирование запросов 2.2.1 Описание источников Не следует использовать ПОЛНОЕ СОЕДИНЕНИЕ для получения данных из нескольких источников, кроме того случая, когда требуется, чтобы результат был пустым, если один из источников пуст. При необходимости получения данных из двух или нескольких источников (таблиц) в текстах запросов типовых конфигураций рекомендуется использовать левое внешнее соединение, т.е. в списке источников сначала указывать главный источник, который заведомо имеет запрашиваемые данные, затем один или несколько вспомогательных источников, данных из которых может и не быть. Перед каждым вспомогательным источником указывается ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ. Использование правого соединения допускается только в тех особых случаях, когда это может существенно улучшить понимание запроса. 2.2.2 Выбрать Не рекомендуется получать представление объекта ссылочного типа преобразованием ссылки к строке. Если для объекта ссылочного типа планируется использовать его строковое представление (например, для визуализации в отчетах и элементах управления), в запросе следует выбирать предопределенное поле Представление, которое является готовым строковым представлением объекта ссылочного типа. 2.2.3 Из 1. В операторе По следует использовать внутреннее соединение с условием вместо использования двух таблиц с условием в предложении Где. 2. При использовании виртуальных таблиц следует максимально использовать их параметры - для большей эффективности. 2.2.4 Где Регистры накопления и регистры сведений имеют общий индекс по всем измерениям, в порядке их расположения в метаданных. Условие следует накладывать так, чтобы оно охватывало любое количество первых измерений регистра без пропусков. В этом случае используется основной индекс регистра и отбор работает быстро. 25 Если наложить условие таким образом не удается, его стоит накладывать на одно измерение, имеющее индекс. Если отбор может использовать различные индексы регистра, Предприятие осуществляет выбор одного из них самостоятельно. Например, пусть регистр содержит измерения Товар, Покупатель, Поставщик, причем измерение Поставщик – индексированное. Целесообразно накладывать фильтры на комбинации измерений Товар; Товар, Покупатель; Товар, Покупатель Поставщик; Поставщик. Фильтр Покупатель не будет использовать индекс регистра, т.е использует полный перебор записей; фильтр Покупатель, Поставщик будет использовать индекс по измерению Поставщик, а результат будет отобран по фильтру Покупатель полным перебором. 2.2.5 Сгруппировать В списке полей должны содержаться полные описания полей. Пример Если некое поле ГруппаЦен определяется при помощи оператора ВЫБОР, то для группировки по значению этого поля в разделе СГРУППИРОВАТЬ ПО нужно полностью повторить выражение – описание поля из списка полей выборки (за исключением объявления его псевдонима). ВЫБРАТЬ …, ВЫБОР КОГДА Цена > 100 ТОГДА «больше 100» ИНАЧЕ «меньше 100» КОНЕЦ КАК КатегорияЦен, … ИЗ … СГРУППИРОВАТЬ ПО …, ВЫБОР КОГДА Цена > 100 ТОГДА «больше 100» ИНАЧЕ «меньше 100» КОНЕЦ, … Для оптимизации работы , синтаксического и логического контроля, при разработке запроса необходимо и рекомендуемо использовать конструктор запросов (или другие построители запросов). 3. Стандартные действия при начале и завершении работы 3.1 Общие положения Стандартные действия при начале работы включают: проверку конфигурации на самый первый запуск; первоначальное заполнение информационной базы; проверку на первый запуск нового релиза; обработку информационной базы при обновлении релиза; вывод информации о новом в релизе. Стандартные действия при завершении работы включают: выдачу запрос о необходимости закончить работу с программой. 3.2 Первый запуск конфигурации и первоначальное заполнение ИБ Для корректной работы конфигурации требуется, чтобы в информационной базе, еще до начала работы пользователя с конфигурацией, была уже заведена некая обязательная информация: были заполнены конкретными значениями некоторые константы; в справочники введены обязательные элементы; 26 Также может быть предусмотрено первоначальное заполнение справочников необходимой информацией - для ускорения начал работы пользователя с конфигурацией. Конфигурация должна уметь определять, когда она запускается в первый раз, и выполнять необходимые действия. При этом обязательное первоначальное заполнение выполняется без дополнительных запросов у пользователя, а необязательное - с предварительным запросом. Изложенные требования реализуется при помощи универсального механизма заполнения и обновления ИБ. 3.3 Первый запуск нового релиза и обновление ИБ При обновлении релиза конфигурации зачастую требуется выполнять дополнительную обработку информационной базы. Конфигурация должна уметь определять первый запуск с новым релизом, и производить необходимые действия по «освежению» информации. Обработка информации в ИБ также должна разделяться на обязательную и необязательную. Обязательная обработка выполняется без запроса, на выполнение необязательной обработки выдается запрос пользователю. Обработка запуска нового релиза должна выполнять обновление с любого предыдущего релиза. По окончанию действий по обновлению ИБ пользователю выдается отчет, содержащий описание изменений в релизе по сравнению с тем, который был до обновления. То есть, если выполняется обновление более чем на один релиз - выдается описание изменений во всех релизах. Изложенные требования реализуется при помощи универсального механизма заполнения и обновления ИБ. 3.4 Запрос при закрытии программы В конфигурации должна быть предусмотрена возможность исключения случайных выходов из конфигурации из программы «1С:Предприятие», например, если пользователь по ошибке нажал кнопку закрытия главного окна программы. При выходе из конфигурации пользователю выводится вопрос: «Закончить работу с программой?». Если пользователь подтверждает выход из программы - программа закрывается. Если отказывается от выхода - он продолжает работу с программой. Необходимо иметь возможность отключать вывод вопроса - в персональных настройках каждого пользователя. В диалоге самого вопроса, возможно, следует описать, как отключить запрос. Раздел III. Особенности работы с хранилищем конфигурации Хранилище конфигурации предназначено для коллективной разработки конфигурации. В хранилище сохраняется история разрабатываемой конфигурации, а также информация о том, когда и кто вносил изменения в конфигурацию. Разработка конфигурации с использованием хранилища может вестись неограниченным числом пользователей. 1.1 Принцип работы Хранилище конфигурации представляет собой базу данных, в которой сохраняются все изменения конфигурации, сделанные в процессе её разработки. После подключения информационной базы к хранилищу из него в информационную базу загружается последняя версия конфигурации, и все объекты метаданных конфигурации становятся недоступными для редактирования. Гранулой редактирования - объектами разработки - являются все основные объекты метаданных (такие как справочники, документы, регистры сведений), а также формы и макеты. Объекты разработки могут редактироваться независимо друг от друга разными пользователями. Реквизиты, табличные часть и т.д. не являются отдельными объектами с логической точки зрения, 27 поэтому они не были включены в состав объектов разработки. Данные объекты метаданных редактируются в составе своих родительских объектов, являющихся объектами разработки. Для получения возможности редактирования объекта необходимо произвести его захват в хранилище. При выполнении захвата из хранилища будет получена (в случае наличия) новая версия объекта разработки. После внесения изменений объект необходимо поместить в хранилище, после этого обновленная версия объекта становится доступной для других пользователей, участвующих в процессе разработки конфигурации. Если же изменения не должны быть помещены в хранилище, то предусмотрена процедура отмены захвата, при которой из хранилища получается старая версия объекта разработки. Таким образом, можно выделить четыре простейшие операции работы с хранилищем: захват объекта в хранилище; помещение объекта в хранилище; получение объекта из хранилища; отмена захвата в хранилище. Для параллельной разработки конфигурации в хранилище используется стратегия пессимистической блокировки: в то время, пока объект разработки редактируется одним пользователем, другие пользователи не имеют возможности его редактировать. Стоит обратить внимание на тот факт, что при подключении информационной базы к хранилищу конфигурации происходит полная замена текущей редактируемой конфигурации конфигурацией хранилища. Это необходимо для обеспечения полного соответствия идентификаторов объектов метаданных. Если все же имеется информационная база, часть объектов метаданных конфигурации которой необходимо перенести в конфигурацию хранилища, то необходимо: выгрузить конфигурацию из информационной базы в файл, подключить информационную базу к хранилищу конфигурации, выполнить захват объектов, которые необходимо заместить, произвести объединение с требуемой конфигурацией. Важно понимать, что предметом разработки является конфигурация, а не отдельные объекты. Хранилище ведет историю развития конфигурации. При помещении объектов разработки в хранилище создается новая версия конфигурации, для которой записываются: дата создания версии, пользователь, создавший версию, а также списки объектов разработки, которые были добавлены, изменены, удалены в процессе получения данной версии конфигурации. История объектов разработки не ведется. Несмотря на то, что имеется возможность просмотра истории объекта разработки, отдельно загрузить из хранилища объект разработки какой-либо версии конфигурации невозможно, возможна лишь загрузка из хранилища версии конфигурации целиком. Однако все же имеется возможность получения объекта определенной версии конфигурации: необходимо захватить объект и выполнить объединение с версией конфигурации, в которой данный объект имеет требуемое состояние. При создании новой версии конфигурации хранилища имеется возможность записать комментарий к этой версии. Рекомендуется комментировать версии конфигурации, для того чтобы впоследствии можно было понять, что именно было изменено в данной версии конфигурации. Для наиболее значимых версий (например: выпуск релиза) рекомендуется также устанавливатьметку - строку, кратко описывающую версию конфигурации хранилища. В процессе разработки конфигурации с использованием хранилища рекомендуется периодически получать актуальное состояние объектов разработки. Это позволяет избежать возможных трудностей при помещении объектов в хранилище (например, при удалении объектов метаданных из конфигурации). Средства работы с хранилищем конфигурации позволяют просматривать историю версий конфигурации хранилища, сохранять конфигурацию определенной версии в файл, сравнивать с другими версиями конфигурации данного хранилища или же сравнивать с другой конфигурацией из файла. 28 Если по каким-либо причинам хранилище конфигурации недоступно, то имеется возможность продолжать работу с объектами разработки, захваченными ранее в хранилище. Таким образом, можно вести разработку, не имея постоянной непосредственной связи с хранилищем конфигурации. 1.2 Режимы использования Для работы с хранилищем конфигурации предусмотрено несколько способов: с подключением информационной базы к хранилищу; без подключения информационной базы к хранилищу. Данные режимы отличаются друг от друга как набором функциональности, предоставляемой платформой "1С:Предприятие", так и своим предназначением. 1.2.1 Работа с подключением информационной базы к хранилищу Этот режим является основным режимом работы с хранилищем. Он используется для групповой разработки конфигурации несколькими пользователями. Работа в данном режиме начинается с процедуры подключения информационной базы к хранилищу. К одному хранилищу может быть одновременно подключена одна информационная база от имени одного пользователя. Если пользователь, у которого уже имеется информационная база, подключенная к данному хранилищу, произведет попытку подключения другой информационной базы, то ему будет выдано соответствующее предупреждение. Если же подключение все же будет осуществлено, то прежняя информационная база уже не сможет работать с данным хранилищем конфигурации без предварительного отключения от него. Аутентификация в хранилище от имени пользователя, не подключавшего данную информационную базу к хранилищу, невозможна. При подключении информационной базы к хранилищу в нем регистрируется строка соединения с информационной базой. Если при последующих соединениях с хранилищем данная строка будет изменена (по каким-либо причинам информационная база была перемещена на другой ресурс), то платформой будет выдано соответствующее предупреждение, и, в случае подтверждения соединения, строка соединения будет обновлена. Если соединение происходило копией информационной базы, то работа оригинала с данным хранилищем будет невозможна без предварительного отключения от него. 1.2.2 Работа без подключения информационной базы к хранилищу Режим обеспечивает возможность просмотра и администрирования хранилища без подключения к нему, т.е. без замены редактируемой конфигурации конфигурацией хранилища. В данном режиме пользователь может получить конфигурацию определенной версии хранилища, посмотреть историю конфигурации или отдельных объектов разработки, произвести действия по редактированию прав пользователей или изменению их состава. Работа в данном режиме начинается с открытия хранилища конфигурации, данная процедура заключается в аутентификации пользователя в хранилище, которая будет автоматически предложена при выполнении любого первого действия с хранилищем в данной сессии работы Конфигуратора. Для открытия другого хранилища в данной сессии Конфигуратора необходимо закрыть текущее хранилище конфигурации, выбрав соответствующий пункт меню. Предполагается, что данный режим будет использоваться для подготовки дистрибутивов конфигураций на основе файлов выгрузки информационных баз. Данная процедура может выглядеть следующим образом: 1. 2. 3. 4. 5. Создать новую информационную базу. Открыть хранилище конфигурации. Из хранилища конфигурации загрузить конфигурацию нужной версии. Заполнить информационную базу необходимыми данными. Подготовить дистрибутив конфигурации. 29 6. В процессе модернизации конфигурации хранилища для выпуска новых дистрибутивов необходимо повторить процедуру, начиная с пункта 2, и, если новых данных вводить не требуется, сразу выполнить подготовку дистрибутива. 1.3 Режим совместимости хранилища конфигурации Начиная с версии платформы 8.3.3, в хранилище добавлен режим совместимости. Режим совместимости позволяет старшим версиям платформы работать с хранилищами, созданными в младших версиях платформы (начиная с версии 8.3.2), без конвертации. Режим совместимости можно установить в окне "Администрирование хранилища" на закладке "Прочие". На данный момент можно установить один из двух режимов совместимости: "Версия 8.3.2" и "Не использовать". При смене режима и нажатии кнопки "Установить" происходит конвертация базы данных хранилища конфигурации. Особенности работы хранилища в режиме совместимости "Версия 8.3.2": осуществляется строгий контроль ссылочной целостности при получении/помещении объектов; объекты метаданных хранятся в базе данных хранилища; режим устанавливается по умолчанию для существующих хранилищ конфигураций. Особенности работы хранилища в режиме совместимости "Не использовать": контроль ссылочной целостности такой же, как и на уровне объектов метаданных. Это позволяет повысить параллельность процесса разработки конфигурации, т.к. необходимо захватывать меньшее количество зависимых объектов; объекты метаданных хранятся в файловой системе, что позволяет существенно увеличить объем данных, которые можно поместить в хранилище; режим устанавливается для вновь создаваемых хранилищ конфигураций. 1.4 Контроль ссылочной целостности Стандартные механизмы контроля ссылочной целостности конфигурации обеспечивают контроль на уровне объектов метаданных: нельзя, например, удалить из конфигурации справочник, если на него ссылается реквизит документа и т.д. На уровне интерфейсов, форм и макетов такой контроль не ведется. Пример: удаление справочника Склады из демонстрационной конфигурации "Примеры ИТС": происходит проверка имеющихся на этот объект ссылок в других объектах:Копировать в буфер обмена "Справочник.Склады" использован в: Документ.ПриходнаяНакладная.Реквизит.Склад.Тип Документ.РасходнаяНакладная.Реквизит.Склад.Тип РегистрНакопления.УчетНоменклатуры.Измерение.Склад.Тип после удаления обнаруженных ссылок справочник Склады успешно удаляется из конфигурации, хотя ссылка на него по-прежнему имеется в интерфейсе Основной (кнопка Склады из подменю Справочники содержит действие "Склады: Открыть справочник") и формах документов ПриходнаяНакладная, РасходнаяНакладная (поля ввода, предназначенные для редактирования реквизитов Склад по-прежнему имеют тип СправочникСсылка.Склады). В режиме совместимости "Версия 8.3.2" хранилище конфигурации обеспечивает более строгий контроль ссылочной целостности конфигурации. Производится полный контроль ссылок между объектами метаданных как на уровне самих объектов, так и на уровне содержимого их форм и макетов, а также содержимого интерфейсов. 30 Следствием этого факта является необходимость получения из хранилища (помещения в хранилище) объектов, так или иначе связанных с объектом, над которым непосредственно производится действие. Однако хранилище конфигурации производит анализ ссылок объекта и требует получения (помещения) дополнительных объектов только в случае необходимости. В режиме совместимости "Не использовать" хранилище конфигурации обеспечивает контроль ссылочной целостности только на уровне объектов метаданных; на уровне интерфейсов, форм и макетов контроль не ведется. Анализ ссылок производится рекурсивно: сначала производится анализ объекта, с которым производится действие в хранилище; затем при обнаружении необходимости выполнения операции над дополнительными объектами аналогичный анализ производится для них, и так до тех пор, пока ссылки всех требуемых объектов не будут проанализированы. 1.5 Особенности конфигурирования Разработка конфигурации в информационной базе, подключенной к хранилищу конфигурации, имеет некоторые особенности. Как уже говорилось ранее, для получения возможности редактирования объекта необходимо произвести его захват в хранилище конфигурации. Если необходимо внести изменения в объект метаданных, не являющийся объектом разработки (реквизиты, табличные части), то необходимо произвести захват того объекта разработки, который содержит данные объекты метаданных. Для добавления нового объекта метаданных или же для изменения порядка следования существующих объектов необходимо произвести захват родительского объекта разработки. 1.6 Удаление объектов конфигурации Особое внимание стоит уделить процедуре удаления объектов метаданных из конфигурации. Для удаления объекта метаданных из конфигурации необходимо захватить в хранилище сам удаляемый объект, его родительский объект, а также все подчиненные объекты удаляемого. После чего появится возможность удалить объект из конфигурации. Однако при помещении в хранилище, если на удаленный объект имеются ссылки в других объектах, средства работы с хранилищем потребуют помещение этих объектов в хранилище с очищенными ссылками на удаленный объект. Рекомендуется перед удалением объекта из конфигурации производить поиск ссылок на данный объект. Произвести захват в хранилище всех обнаруженных объектов и вычистить из них все ссылки на удаляемый объект. В режиме совместимости "Версия 8.3.2" после этого необходимо удалить все ссылки на удаляемый объект из форм, интерфейсов и макетов. В режиме совместимости "Не использовать" удалять ссылки на удаляемый объект из форм, интерфейсов и макетов не требуется. После этого необходимо удалить объект из конфигурации и произвести попытку помещения изменений в хранилище. Если помещение в хранилище завершится неудачей из-за обнаружения ссылок на удаленный объект, то необходимо захватить указанные объекты и произвести повторную попытку помещения изменений в хранилище. Пример: удаление справочника Склады из демонстрационной конфигурации "Примеры ИТС" в режиме совместимости хранилища "Версия 8.3.2": Производим поиск ссылок на удаляемый объект:Копировать в буфер обмена "Справочник.Склады" использован в: Документ.ПриходнаяНакладная.Реквизит.Склад.Тип Документ.РасходнаяНакладная.Реквизит.Склад.Тип РегистрНакопления.УчетНоменклатуры.Измерение.Склад.Тип 31 Захватываем данные объекты и удаляем из них реквизиты, ссылающиеся на справочник Склады. Захватываем интерфейс "Основной" и удаляем из него кнопку Склады из подменю Справочники с действием "Склады: Открыть справочник". Захватываем корневой объект конфигурации и справочник Склады. Удаляем справочник Склады из конфигурации. Производим попытку помещения корневого объекта конфигурации в хранилище: После нажатия кнопки OK в окне сообщений будет выведена следующая информация:Копировать в буфер обмена Ошибка помещения объектов в хранилище. Для выполнения операции необходимо поместить в хранилище объекты: - Документ.ПриходнаяНакладная.Форма.ФормаДокумента (объект не захвачен пользователем) - Документ.РасходнаяНакладная.Форма.ФормаДокумента (объект не захвачен пользователем) Захватываем объекты, в которых обнаружены ссылки на удаленнный объект. Производим попытку помещения корневого объекта конфигурации в хранилище. После подтверждения помещения объектов в хранилище будет выведено предупреждение об обнаружении ссылок на удаленный объект: При этом в окне сообщений будет выведена следующая информация:Копировать в буфер обмена Операция не может быть выполнена: 32 Объект 'Документ.ПриходнаяНакладная.Форма.ФормаДокумента' содержит ссылки на удаленные объекты: - Справочник.Склады Объект 'Документ.РасходнаяНакладная.Форма.ФормаДокумента' содержит ссылки на удаленные объекты: - Справочник.Склады После утвердительного ответа на предложение об очистке от некорректных ссылок будет выполнена процедура очистки, сохранена конфигурация и вновь произведена попытка помещения объектов в хранилище: После нажатия кнопки OK в окне сообщений будет выведена следующая информация:Копировать в буфер обмена Объект Объект Объект Объект Объект Объект Объект помещен помещен помещен помещен помещен помещен помещен в в в в в в в хранилище: хранилище: хранилище: хранилище: хранилище: хранилище: хранилище: ПримерыИТС Документ.ПриходнаяНакладная.Форма.ФормаДокумента Документ.ПриходнаяНакладная Документ.РасходнаяНакладная.Форма.ФормаДокумента РегистрНакопления.УчетНоменклатуры Интерфейс.Основной Документ.РасходнаяНакладная Удаление справочника Склады завершено. Пример: удаление справочника Склады из демонстрационной конфигурации "Примеры ИТС" в режиме совместимости хранилища "Не использовать": Производим поиск ссылок на удаляемый объект:Копировать в буфер обмена "Справочник.Склады" использован в: Документ.ПриходнаяНакладная.Реквизит.Склад.Тип Документ.РасходнаяНакладная.Реквизит.Склад.Тип РегистрНакопления.УчетНоменклатуры.Измерение.Склад.Тип 33 Захватываем данные объекты и удаляем из них реквизиты, ссылающиеся на справочник Склады. Захватываем корневой объект конфигурации и справочник Склады. Удаляем справочник Склады из конфигурации. Производим попытку помещения корневого объекта конфигурации в хранилище: После нажатия кнопки OK в окне сообщений будет выведена следующая информация:Копировать в буфер обмена Объект помещен в хранилище: ПримерыИТС Объект помещен в хранилище: Документ.ПриходнаяНакладная Объект помещен в хранилище: РегистрНакопления.УчетНоменклатуры Объект помещен в хранилище: Документ.РасходнаяНакладная Удаление справочника Склады завершено. Таким образом, удаление объекта метаданных из конфигурации, разрабатываемой при использовании хранилища, требует аккуратности и внимательности. 1.7 Оптимизация хранения данных в хранилище конфигурации В режиме совместимости хранилища "Не использовать" объекты метаданных хранятся в файловой системе, что позволяет существенно увеличить объем данных, которые можно поместить в хранилище. Большое количество файлов может несколько замедлять работу с хранилищем (особенно при расположении хранилища на сетевом диске). Поэтому, если стало заметно некоторое замедление работы с хранилищем, в окне "Администрирование хранилища" на закладке "Прочие" можно выполнить оптимизацию хранения данных хранилища. При включенном флажке "Предлагать оптимизацию после выполнения операций с хранилищем" в окне "Администрирование хранилища" администратору хранилища будет предлагаться провести оптимизацию хранения данных хранилища. 34