Содержание
- 1. Добавление реквизитов на 1С управляемые формы
- 2. Добавить элементы на форму
- 3. Установка событий элементам формы
- Привязки элементов управления
- Порядок обхода элементов управления
- Обновление данных формы
- Структура
- Как создать структуру?
- Как добавить элементы в структуру?
- Как обратиться к элементу структуры?
- Как перебрать элементы структуры?
- Как удалить элемент структуры?
- Как в структуре установить значение для элемента с определенным ключом?
- Как получить в структуру многомерные данные? Как собрать информацию по установленным в форме журнала отборам?
- Как определить, есть ли в структуре элемент с ключом «Контрагент», и если есть, но содержит пустое значение справочника или Неопределено — удалить этот элемент?
- Как из табличной части «Товары» документа получить все строки, где значение реквизита «Цена» равно нулю, а значение реквизита «СтавкаНДС» равно значению «НДС18» перечисления «СтавкиНДС»?
- Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату?
- Как сформировать структуру названий реквизитов табличной части произвольного документа?
- Как получить запросом данные табличной части документа, имея структуру названий реквизитов табличной части?
- Свежие материалы
1. Добавление реквизитов на 1С управляемые формы
2. Добавить элементы на форму
3. Установка событий элементам формы
При адаптации типовых конфигураций 1С часто приходится изменять в 1С 8 управляемые формы. Такие адаптации сложно потом поддерживать при обновлении. Такие изменения приходится вносить вручную заново, перепроверять корректность изменений в каждом обновлении. И если таких изменений множество, то каждое обновление может представлять серьезные трудозатраты. Есть несколько решений, которые позволяют упростить поддержку и обновление измененных систем 1С. Одно из них – это программное изменение форм.
Вести разработку в таком режиме получается немного дольше, чем прямое изменение формы. Но это хорошо компенсируется в дальнейшем при поддержке и обновлении системы 1С. На самом деле ничего сложного в этом нет, просто нужно привыкнуть.
Чтобы упростить разработку изменений формы, можно воспользоваться небольшой хитростью. Все изменения можно сначала внести на форму через конфигурирование и отладить доработку формы. После преобразовать программные изменения в код.
Изменения, которые нужны в форме изначально, стоит вносить в процедуре «ПриСозданииНаСервере». Для внесения изменений лучше сделать отдельную процедуру (например, «ДополнитьФормуПрограммно») и вызывать ее в штатной процедуре «ПриСозданииНаСервере», тогда изменение типовой формы 1С будет выглядеть одной строчкой:
Согласитесь, обновить доработанную таким образом форму значительно проще, чем вручную сравнивать и вносить все изменения формы при каждом обновлении. Конечно при сильном изменении типовой формы, могут потребоваться правки в процедуре программного дополнения формы, но такие случаи довольно редкие.
Рассмотрим на примерах, как делать доработку управляемых форм кодом в 1С.
1. Добавление реквизитов на 1С управляемые формы
Если в ходе разработки изменилась типовая структура объекта, то добавлять новые реквизиты на форму нет необходимости. Эти реквизиты будут доступны по пути «Объект.НовыйРеквизит».
Но иногда нужно добавить реквизит формы. Например, «Статус документа», который будет заполняться из специального регистра при открытии формы. Добавить новые реквизиты можно, открыв в 1С табличный документ, управляемая форма изменяется через команду ИзменитьРеквизиты(«ДобавляемыеРеквизиты», «УдаляемыеРеквизиты»).
«ДобавляемыеРеквизиты» и «УдаляемыеРеквизиты» – это массивы с элементами типа «РеквизитФормы». Тут все просто – «Добавляемые» добавляются, «Удаляемые» – удаляются.
Функция РеквизитФормы («ИмяРеквизита», «ТипРеквизита», «Путь», «Заголовок») создает объект типа «РеквизитФормы».
Тут важно понимать, что «ИмяРеквизита» содержит имя без точек. То есть имя без пути реквизита. Если нужно добавить реквизит, например, табличной части объекта, то уже в реквизите «Путь» указать путь к ТЧ реквизита – «Объект.Товары». «ТипРеквизита» задается через объект «ОписаниеТипов».
В примере ниже я добавил два реквизита «ЭтоСборка» для табличной части «Товары» у объекта и «СтатусОбработки» на форму документа.
2. Добавить элементы на форму
После программного добавления реквизитов на форму нужно добавить элементы на форму или изменить свойства текущих.
Для добавления новых элементов на форму есть два метода:
-Элементы.Добавить(«ИмяЭлемента», «ТипЭлемента», «Родитель»).
-Элементы.Вставить(«ИмяЭлемента», «ТипЭлемента», «Родитель», «Элемент»).
«ИмяЭлемента» должно быть уникальным в рамках элементов формы. Лучше добавить какой-то префикс, чтобы не возникло пересечений с типовыми элементами формы.
«ТипЭлемента» имеет не так уж много вариантов. Это «ПолеФормы», «ГруппаФормы», «ДекорацияФормы», «КнопкаФормы» и «ТаблицаФормы». Все остальные свойства назначаются через «Вид» создаваемого элемента. Например, поле с типом булево лучше сделать «флажком», установив вид элементу «ВидПоляФормы.ПолеФлажка».
В свойстве «Родитель» нужно указать группу или таблицу формы, в которую будет входить новый элемент. Также можно добавить элемент непосредственно на управляемую форму без подчинения другим элементам.
Для функции вставить дополнительно указывается «Элемент», перед которым будет вставлен новый создаваемый элемент формы.
На примере ниже я добавил статус обработку в форму шапки и поле флажка в табличную часть товары перед единицей измерения.
3. Установка событий элементам формы
Ну и конечно же, мало просто добавить элементы на форму. Система должна реагировать на действия пользователя с формой.
Для установки событий элементам нужно использовать процедуру УстановитьДействие («ИмяСобытия», «Действие»).
«ИмяСобытия» — имя события, которое нужно отработать. Например, «ПриИзменении», «Очистка», «ОбработкаВыбора» и т.п.
«Действие» — процедура отработки события. Самое главное процедура должна содержать параметры необходимые для выполняемого события. Например, процедура «ПриИзменении» должна иметь параметр «Элемент».
Также программно можно задавать прочие доступные свойства новых элементов формы. Например, установить видимость кнопки очистки:
НовыйЭлемент.КнопкаОчистки = Истина;
Получилась вот такая процедура программного заполнения управляемой формы:
Код для копирования:
&НаСервере
Процедура КЛ_ДополнитьФормуПрограммно()
МассивРеквизитовФормы = Новый Массив;
//Новый реквизит Товары.КЛ_ЭтоСборка
НовыйРеквизитФормы = Новый РеквизитФормы(«КЛ_ЭтоСборка»,
Новый ОписаниеТипов(«Булево»)
,»Объект.Товары»
,»Это сборка»);
МассивРеквизитовФормы.Добавить(НовыйРеквизитФормы);
//Новый реквизит КЛ_СтатусОбработки
НовыйРеквизитФормы = Новый РеквизитФормы(«КЛ_СтатусОбработки»,
Новый ОписаниеТипов(«ПеречислениеСсылка.СтатусыДокументовРеализации»)
,
,»Статус обработки»);
МассивРеквизитовФормы.Добавить(НовыйРеквизитФормы);
ИзменитьРеквизиты(МассивРеквизитовФормы);
НовыйЭлемент = Элементы.Добавить(«КЛ_СтатусОбработки», Тип(«ПолеФормы»), Элементы.ГруппаШапкаЛевая);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.КнопкаОчистки = Истина;
НовыйЭлемент.УстановитьДействие(«ПриИзменении»,»КЛ_ПриИзмененииСтатусаОбработки»);
НовыйЭлемент = Элементы.Вставить(«КЛ_ЭтоСборка», Тип(«ПолеФормы»),Элементы.Товары,Элементы.ТоварыКоличество);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеФлажка;
КонецПроцедуры
Привязки элементов управления
В отличие от версии 7.7, когда при масштабировании формы реквизиты диалога неконтролируемо «разбредались» по форме, в версии 8.0 для каждого реквизита диалога формы возможна настройка привязок границ к форме (простая привязка) и к расположенным рядом другим элементам управления (сложная привязка).
В диалоговом окне «Привязка границ для элемента управления», вызываемого из палитры свойств элемента управления из категории свойств «Расположение», можно на закладке «Простая» установить простые привязки объекта:
- к границам;
- к центру;
- растягивать;
- пропорционально.
При простой привязке элемент может быть привязан как к самой форме или панели, а также к элементам управления типа «Разделитель». При этом в список объекта включаются только те разделители, которые попадают в зону пересечения с привязываемым элементом.
На закладке «Сложная» можно установить привязки каждой границы объекта, как к другим элементам, так и к границам формы. При создании новой формы, в её свойствах всегда установлено «Автоматическая привязка». Система автоматически настраивает правила привязок. Если в форме настройки привязок были настроены пользователем, то установка данного правила приведет к потере существующих настроек.
Включить режим просмотра привязок можно выбрав пункт главного меню «Форма — Показать привязки».
После настройки привязок можно проверить корректность параметров настройки с помощью запуска тестового варианта формы — меню «Форма» — «Проверить» или комбинации клавиш «Ctrl+R».
Появились маркеры положения элемента на форме, сигнализирующие о несовпадении координат по вертикали или горизонтали по отношению к ближайшим элементам управления. Наличие привязки показывается специальным маркером , расположенным рядом с маркерами сторон элемента.
Включить режим выравнивания с помощью специальных маркеров можно через главное меню «Сервис», выбрав пункт «Параметры — Форма» и в области «Указатели» установив флажки.
Маркеры появляются, когда два элемента управления находятся в непосредственной близости друг от друга (зона в +16 пикселей от ближайшей границы установленного элемента).
Синие выравнивающие маркеры указывают желаемое направление перемещения элемента управления для выравнивания его по одной из границ соседнего элемента управления:
Красные выравнивающие маркеры указывают желаемое направление перемещения элемента управления в случае, когда он перекрывает другой элемент управления:
Также редактор поддерживает операции выравнивания, изменения размеров и порядка для группы элементов управления:
Для просмотра списка элементов управления формы и быстрого поиска элемента в форме предназначен диалог, вызываемый пунктом «Форма — Список элементов управления формы».
В диалоге показывается дерево всех элементов управления, размещенных в текущей форме.
Справа от имени элемента управления может размещаться пиктограмма, вид которой показывает на особенности расположения данного элемента. Пиктограммами показывается наложение элемента управления на другой элемент, отсутствие выравнивания. В случае полного расположения над или под другим элементом показывается прямоугольник с красным пунктиром внутри.
Редактор форм поддерживает использование выравнивающих линий, которые служат для облегчения выравнивания и взаимного расположения элементов управления формы. Выравнивающие линии могут отсутствовать. Для установки режима использования выравнивающих линий в свойствах формы необходимо установить «Использовать выравнивающие линии». Если свойство установлено, то по умолчанию каждая страница формы содержит выравнивающие линии по периметру формы. Это краевые выравнивающие линии. Все элементы управления располагаются на странице в пределах, установленных этими линиями.
На странице можно расположить дополнительные вертикальные и горизонтальные выравнивающие линии (в контекстном меню выбрать пункт «Добавить : выравнивающую линию») и осуществить по ним привязку места расположения элементов управления. Для удаления выравнивающей линии в контекстном меню необходимо выбрать пункт «Удалить выравнивающую линию».
Если требуется удалить все выравнивающие линии, в контекстном меню формы необходимо выбрать пункт «Удалить все выравнивающие линии». В этом случае сбрасываются все дополнительные выравнивающие линии, а краевые линии устанавливаются по периметру формы с отступом.
Невидимые выравнивающие линии редактор создает автоматически после того, как два или более элемента управления выравнены по любой из границ. Например, если два поля одинакового размера были выровнены по левой границе, то невидимая выравнивающая линия будет создана вдоль правых выровненных границ этих полей.
Одним из приемов выравнивания элементов управления является выравнивание границ и размеров по разметочной сетке, расположенной в форме. Для отображения сетки необходимо через меню «Сервис — Параметры — Форма» в области «Сетка» установить флажок «Отображать сетку».
Управление разметочной сеткой производится в категории свойств формы «Редактирование». Если для формы установлено свойство «Выравнивать по сетке», разметка изображается точками, расположенными в местах пересечения линий разметки (можно использовать режим показа точек в шахматном порядке). Можно задать шаг сетки — размер ячеек сетки по горизонтали и вертикали, для этого в свойствах формы Гор. шаг сетки или Верт. шаг сетки необходимо ввести целое число от 1 до 99.
Порядок обхода элементов управления
Для возможности интерактивной настройки порядка обхода элементов управления формы необходимо в палитре свойств формы снять флажок «Автопорядок обхода».
При снятом флажке «Автопорядок обхода» порядок обхода элементов управления каждой панели формы можно посмотреть через меню «Форма — Порядок обхода». Если данный порядок обхода не устраивает, его можно изменить, прощелкивая левой мышкой выделенные номера порядка обхода в нужной последовательности.
Порядок обхода также можно настроить через меню «Форма — Настройка порядка обхода». При установленном флажке «Автопорядок обхода» будет выдано сообщение:
Если мы хотим продолжить и нажмем кнопку «Да», то будет открыто окно «Настройка порядка обхода».
Задание 6
Настройте порядок обхода элементов в форме документа «Акт об оказании услуг».
Обновление данных формы
Списки в формах пользователь может обновить по кнопке или сочетанием клавиш (Ctrl+Shift+R) или через меню «Действия — Настройка списка» формы.
Немного базовой теории
Перед тем, как перейти к содержательной части, договоримся о некоторых ограничениях:
- Мы подразумеваем, что Вы знаете о существовании четырёх директив компиляции, доступных в модулях формы: «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста».
- Все примеры будут опираться на работу «1С:Предприятие 8» в клиент-серверном режиме. Файловый вариант по сути является эмуляцией клиент-серверного режима, с небольшими отклонениями (для данной статьи это не критично)
- В рамках этого материала рассматривается исключительно взаимодействие клиента и сервера 1С. Работа с базой данных, преобразование данных и прочие нюансы работы системы – это темы других статей.
Далее, освежим в памяти немного теории.
Директивы, в имени которых упоминается «Клиент», устанавливают ограничение на обращение к базе данных.
Процедуры или функции, написанные под директивой «Без контекста», не имеют доступа к контексту (данным) формы. Исходя из этой информации, легко представить ограничения директив по доступу к данным в виде следующей таблицы:
Директива | Данные формы | База данных |
&НаКлиенте | + | – |
&НаСервере | + | + |
&НаСервереБезКонтекста | – | + |
&НаКлиентеНаСервереБезКонтекста | – | – |
Опережая вопрос «Для чего же директива с самым длинным названием, если она ограничивает и использование контекста форм, и обращения к базе данных?», напомню: любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.
Отсюда делаем вывод: у методов, описанных под директивой «&НаКлиентеНаСервереБезКонтекста», единственным источником данных являются эти самые переданные параметры.
Не стоит забывать и про доступность вызова одних процедур и функций из других. Для этого стоит запомнить, что можно вызывать только те процедуры и функции, которые находятся под одноимённой (с родительским методом) директивой или под директивой, находящейся ниже (чем у родительского метода) согласно списку:
- &НаКлиенте
- &НаСервере
- &НаСервереБезКонтекста
- &НаКлиентеНаСервереБезКонтекста.
То есть из метода, описанного под директивой «&НаКлиенте», можно вызывать процедуры и функции, описанные под любой директивой. А вот «из-под» директивы «&НаСервереБезКонтекста» можно вызывать только то, что описано под директивой «&НаСервереБезКонтекста» или «&НаКлиентеНаСервереБезКонтекста».
Теперь про серверный вызов
Серверный вызов – это передача какой-то информации с клиентской части «1С:Предприятие 8» на серверную часть с целью вернуть обратно некий набор данных.
Самый первый серверный вызов инициализируется в момент начала сеанса работы 1С. То есть когда пользователь выполняет вход в информационную базу:
Рисунок 1
«Оу! При чём тут Библиотека?!» – спросите Вы.
Всё очень просто:
Рисунок 2
Обратите внимание, что доступ к базе данных есть только на серверной части, а соединение между клиентом и сервером имеет ограниченную пропускную способность. Это и неудивительно – ведь соединение между клиентской и серверной частью может быть установлено даже по нестабильному низкоскоростному каналу связи (например, посредством мобильного интернета).
Кроме этого, передача данных между клиентом и сервером возможна только посредством серверного вызова.
Но, для того чтобы перейти к основной теме данной статьи, необходимо сначала разобраться – где будет выполняться программный код, написанный под определенными директивами. То есть на какой части приложения «1С:Предприятие 8» будут доступны процедуры и функции, описанные под директивами «&НаКлиенте», «&НаСервере», «&НаСервереБезКонтекста» и «&НаКлиентеНаСервереБезКонтекста»:
Рисунок 3
Видим, что на стороне клиента у нас будут доступны процедуры и функции, написанные под двумя директивами из четырёх, а на стороне сервера – под тремя из четырёх.
Сразу возникают вопросы: «Зачем такое многообразие и чем оно полезно?», «Как метод, описанный под директивой «&НаКлиентеНаСервереБезКонтекста» может выполняться и на клиенте, и на сервере?».
Сейчас мы постараемся понять особенности работы системы при использовании директив и почему необходимо уметь правильно использовать каждую из существующих директив компиляции.
И в этом нам помогут наши новые друзья, знакомьтесь!
Это процесс клиентской части приложения «1С:Предприятие 8». Он запускается на компьютере пользователя и сожительствует в оперативной памяти с другими процессами (38 вкладок браузера, поток аудио из социальной сети, telegram и другие). Может порождать серверный вызов.
Это процесс серверной части приложения «1С:Предприятие 8». Он существует на сервере 1С. Знает, какие клиентские сеансы в данный момент запущены, но самостоятельно не может инициировать взаимодействие с ними. Работает с клиентской частью только через полученный от неё серверный вызов.
А это серверный вызов. Как было сказано выше, он порождается процессом клиентской части и призван «прислуживать» ему. Он передает запросы со стороны клиента на сторону сервера, а также занимается транспортировкой данных с клиента на сервер и обратно.
Итак, давайте рассмотрим несколько особенностей работы программного кода в «1С:Предприятие 8», написанного под разными директивами.
Действие 1. Открытие пользователем формы с данными.
Рисунок 4 Рисунок 5 В момент нажатия Пользователем кнопки открытия формы из интерфейса, происходит передача управления на Сервер. По переданным параметрам получаются необходимые для построения данные из БД и происходит формирование контекста формы, который затем отправляется на клиентскую часть. У пользователя на экране отображается запрошенная форма.
Действие 2. Получение из открытой Пользователем формы дополнительных данных из Базы данных.
Рисунок 6
Получение этих данных может быть описано под двумя директивами – «&НаСервере» и «&НаСервереБезКонтекста». Рассмотрим оба случая.
Явление 1. Директива «&НаСервере»
Рисунок 7 При вызове процедуры или функции под директивой «&НаСервере» из формы со стороны клиента происходит «упаковка» всего контекста формы и отправка его на сторону сервера.
После выполнения метода на сервере, весь этот «пакет» транспортируется обратно. Таким образом, форма со всеми элементами и данными дважды проходит через самое узкое место системы.
Явление 2. Директива «&НаСервереБезКонтекста»
Рисунок 8 При вызове процедуры или функции под директивой «&НаСервереБезКонтекста» из формы со стороны клиента происходит передача на сторону сервера только тех данных, которые были указаны в качестве параметров. Обратно же передаётся только необходимая информация в уже подготовленном виде.
Таким образом, серверный вызов не несёт лишней нагрузки, и для передачи данных между клиентом и сервером потребуется меньше ресурсов.
Из примеров видно, что далеко не всегда оправдано указание директивы компиляции «&НаСервере» с точки зрения использования контекста (данных) формы на сервере.
Если возможно решить возникшую задачу путём отправки на сервер только определённого набора данных, то надо эту возможность использовать и описывать метод под директивой «&НаСервереБезКонтекста». Это позволит уменьшить нагрузку на серверный вызов, а также не занимать сервер обработкой и хранением ненужной в текущий момент информации.
Кстати, именно поэтому до версии платформы 8.3.7.1759 на сложных формах для управления видимостью элементов рекомендовалось использовать панели со страницами, а не свойство «Видимость». Только начиная с этого релиза отработка изменения видимости элементов стала выполняться на стороне клиента.
До этого момента при каждом изменении свойства «Видимость» происходил серверный вызов, как при использовании директивы «&НаСервере».
Но использование директивы «&НаСервереБезКонтекста» не является панацеей. Помимо нагрузки на серверный вызов, всегда необходимо задумываться ещё над одним параметром.
Действие 3. Обработка данных табличной части формы с получением дополнительной информации из Базы данных.
Рисунок 9
Явление 1. Построчная обработка табличной части на стороне клиента с организацией серверного вызова для получения дополнительной информации из базы данных.
Мы уже знаем – лучше использовать директиву «&НаСервереБезКонтекста».
Рисунок 10 Рисунок 11 При таком построении программного кода происходит множественное обращение со стороны клиента на сервер – по количеству элементов цикла, запущенного на стороне клиента.
Явление 2. Предварительная обработка табличной части на стороне клиента с целью подготовки требуемых к обработке на сервере данных и «упаковки» их в набор параметров. Затем передача этого набора на сервер для получения дополнительной информации из базы данных.
Используем всё ту же директиву «&НаСервереБезКонтекста».
Рисунок 12 В данном случае количество серверных вызовов сведено к минимуму за счёт предварительной подготовки параметров.
Большое количество текущих серверных вызовов может свидетельствовать о неоптимальном программном коде.
Избегайте создания серверных вызовов внутри цикла. Подготовьте набор параметров и единожды выполните его передачу для обработки на сервер. Если предполагается сложная обработка большого количества данных формы – передайте её полностью на сервер (при помощи директивы «&НаСервере») и выполните все действия на стороне сервера.
Если цель серверного вызова, созданного внутри цикла – получить какую-либо информацию из базы данных, то данная операция включает в себя запрос в цикле. А это очень негативно влияет на производительность всей системы в целом.
С директивой «&НаСервереБезКонтекста» вроде бы разобрались. Она нужна для того, чтобы уменьшить объем информации, передаваемой в рамках одного серверного вызова. Дополнительно разобрались с количеством текущих серверных вызовов – необходимо стремиться к их минимизации.
Давайте теперь попробуем разобраться, для чего нужна директива «&НаКлиентеНаСервереБезКонтекста».
Действие 4. Выполнение обработки данных.
Когда предполагается выполнение одной и той же обработки данных из нескольких участков программного кода, разумно этот код поместить в самостоятельную процедуру или функцию. Остаётся только решить, под какой директивой её написать.
Рисунок 13
Та-дам!
Рисунок 14
Для копирования у нас есть ксерокс. Но куда его поставить? На сторону клиента или сервера? Под какой директивой его разместить?
Как было озвучено ранее – любая процедура и функция поддерживает обработку информации, переданной в неё в качестве параметров.
Давайте для начала попробуем разместить копировальный аппарат на стороне клиента. Для этого описываем процедуру или функцию «Ксерокс» под директивой «&НаКлиенте». Тогда процесс клиентской части в любой момент сможет без проблем обратиться к ней и все действия будут выполнены в соответствии с программным кодом.
Но что произойдёт, если потребность в копировании возникнет на стороне сервера? Например, для подготовки данных, передаваемых на сторону клиента, потребуется сделать копию? Напомню – процесс серверной части не имеет возможности самостоятельно инициировать клиентские вызовы.
Рисунок 15
Получается, что использовать директиву «&НаКлиенте» неправильно, а директиву «&НаСервере», как мы изучили ранее – нежелательно. Давайте посмотрим поведение системы при использовании директивы «&НаСервереБезКонтекста».
Рисунок 16
Вроде бы результат достигнут – и с сервера, и с клиента доступно копирование. Но для того, чтобы получить копию данных, используемых на клиенте, приходится делать серверный вызов. А это опять ведет к лишней нагрузке на соединение и временным затратам.
Избавиться от излишней передачи на сервер при сохранении возможности копирования на клиенте и на сервере можно при помощи директивы «&НаКлиентеНаСервереБезКонтекста».
Рисунок 17
Не углубляясь в детали, отметим, что метод, описанный под данной директивой управления, создаётся в двух копиях – и на стороне клиента, и на стороне сервера. Это позволяет выполнить необходимые действия там, где появилась потребность в них (клиент/сервер), без лишних серверных вызовов.
Конечно, вместо того чтобы выделять повторяющийся программный код, описывать его в отдельном методе под директивой «&НаКлиентеНаСервереБезКонтекста», можно поступить по-другому. Просто взять и написать один и тот же участок кода и в клиентской, и в серверной процедуре.
С точки зрения выполнения программы результат будет одинаков. Но объяснение «почему так не надо делать» – это уже совершенно другая тема…
Вместо заключения
В данной статье мы на наглядных примерах рассмотрели влияние различных директив компиляции на такое явление системы «1С:Предприятие 8», как серверный вызов. Как видно, основная причина для выбора правильной директивы – производительность транспортировки данных между клиентской и серверной частью.
Придерживайтесь при разработке следующих правил:
- По возможности не передавайте контекст формы на сторону сервера
- Минимизируйте количество текущих серверных вызовов
- Длительные и ресурсоёмкие задачи запускайте на выполнение на стороне сервера (при возможности – в фоновом режиме).
Учитывайте потребность в доступности тех или иных видов данных, обоснованность передачи управления и не стесняйтесь при необходимости дробить процедуры и функции. И будет Вашему серверному вызову всегда легко, а Вы от пользователей Вашей программы получите «молчаливую благодарность»!
Так ли это важно думать об оптимизации? Тут имеет смысл вспомнить одну историю.
Программист Иван при доработке 1С на своём предприятии сделал ошибку в выборе директивы компиляции. Из-за неё длительность одного из серверных вызовов была больше возможной на полсекунды.
Пользователей, применяющих этот функционал, – 25 человек, и каждый из них за рабочий день в среднем совершает 110 таких операций. Всего впустую за рабочий месяц потрачено 28875 секунд (21 рабочий день * 25 человек * 110 операций * 0,5 секунды) = 8,02 часов.
Иван, каково тебе осознавать, что за месяц ты задолжал своему предприятию целый рабочий день?
Об авторе
Автор статьи – Павел Ванин
г. Владимир
E-mail: pahich@mail.ru
PDF-версия статьи для участников группы ВКонтакте
Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.
Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.
Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.
Структура
- Как создать структуру
- Как добавить элементы в структуру
- Как обратиться к элементу структуры
- Как перебрать элементы структуры
- Как удалить элемент структуры
- Как в структуре установить значение для элемента с определенным ключом
- Как получить в структуру многомерные данные? Как собрать информацию по установленным в форме журнала отборам
- Как определить, есть ли в структуре элемент с ключом «Контрагент», и если есть, но содержит пустое значение справочника или Неопределено — удалить этот элемент
- Как из табличной части «Товары» документа получить все строки, где значение реквизита «Цена» равно нулю, а значение реквизита «СтавкаНДС» равно значению «НДС18» перечисления «СтавкиНДС»
- Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату
- Как сформировать структуру названий реквизитов табличной части произвольного документа
- Как получить запросом данные табличной части документа, имея структуру названий реквизитов табличной части
Как создать структуру?
СозданнаяСтруктура = Новый Структура; Оппонент = Новый Структура («Фамилия, Имя, Отчество, Возраст», «Иванов», «Иван», «Иванович», 7);
Как добавить элементы в структуру?
Оппонент = Новый Структура («Фамилия, Имя, Отчество, Возраст», «Иванов», «Иван», «Иванович», 7); Оппонент.Вставить(«Обращение», «Господин»); Оппонент.Вставить(«Возраст», 25);
Как обратиться к элементу структуры?
ТекущийВозраст = Оппонет.Возраст; КлючСтруктуры = «Возраст»; ТекущийВозраст = Оппонет; ТекущийВозраст = Неопределено; Оппонет.Свойство(«Возраст», ТекущийВозраст); Оппонет.Возраст = 32; Оппонет = 32; Оппонент.Вставить(«Возраст», 32);
Как перебрать элементы структуры?
Для Каждого Элемент из СтруктураПараметров Цикл Сообщить(Элемент.Ключ + «: » + Элемент.Значение); КонецЦикла;
Как удалить элемент структуры?
СтруктураПараметров.Удалить(«Номенклатура»); СтруктураПараметров. Очистить();
Как в структуре установить значение для элемента с определенным ключом?
Структура = Новый Структура; // Добавить новый элемент. Структура.Вставить(«Цвет», WebЦвета.Белый); // Установить значение для элемента с ключом «Цвет». Структура.Вставить(«Цвет», WebЦвета.Синий);
Как получить в структуру многомерные данные? Как собрать информацию по установленным в форме журнала отборам?
СтруктураОтборов = Новый Структура; СтруктураПараметровОтбора = Новый Структура; Для Каждого ЭлементОтбора из ЖурналДокументовСписок.Отбор Цикл Если ЭлементОтбора.Использование Тогда СтруктураПараметровОтбора.Очистить(); СтруктураПараметровОтбора.Вставить(«Имя», ЭлементОтбора.Имя); СтруктураПараметровОтбора.Вставить(«ВидСравнения», ЭлементОтбора.ВидСравнения); СтруктураПараметровОтбора.Вставить(«Значение», ЭлементОтбора.Значение); СтруктураПараметровОтбора.Вставить(«ЗначениеПо», ЭлементОтбора.ЗначениеПо); СтруктураПараметровОтбора.Вставить(«ЗначениеС», ЭлементОтбора.ЗначениеС); СтруктураПараметровОтбора.Вставить(«Представление», ЭлементОтбора.Представление); СтруктураПараметровОтбора.Вставить(«ПутьКДанным», ЭлементОтбора.ПутьКДанным); СтруктураПараметровОтбора.Вставить(«ТипЗначения», ЭлементОтбора.ТипЗначения); СтруктураОтборов.Вставить(ЭлементОтбора.Имя, СтруктураПараметровОтбора); КонецЕсли; КонецЦикла;
Как определить, есть ли в структуре элемент с ключом «Контрагент», и если есть, но содержит пустое значение справочника или Неопределено — удалить этот элемент?
Если Структура.Свойство(«Контрагент», ЗначениеЭлемента) Тогда Если ЗначениеЭлемента = Неопределено ИЛИ ЗначениеЭлемента.Пустая() Тогда Структура.Удалить(«Контрагент»); КонецЕсли; КонецЕсли; Структура.Контрагент Структура
Как из табличной части «Товары» документа получить все строки, где значение реквизита «Цена» равно нулю, а значение реквизита «СтавкаНДС» равно значению «НДС18» перечисления «СтавкиНДС»?
СтруктураДляПоиска = Новый Структура(«Цена, СтавкаНДС», 0, Перечисления.СтавкиНДС.НДС18); МассивСтрок = Товары.НайтиСтроки(СтруктураДляПоиска);
Как получить данные о текущей учетной политике бухгалтерского учета организации из периодического регистра сведений на заданную дату?
// Подготовить отбор по измерению «Организация». СтруктураОтбора = Новый Структура(«Организация», ЮрЛицо); // Получить данные, актуальные на указанную дату. СтруктураДанных = РегистрыСведений.УчетнаяПолитикаБухгалтерскийУчет.ПолучитьПоследнее(ДатаПолучения, СтруктураОтбора); // Прочитать данные из структуры данных. СпособОценкиМпзЮрЛица = СтруктураДанных.СпособОценкиМПЗ; ДиректКостингЮрЛица = СтруктураДанных.ДиректКостинг;
Как сформировать структуру названий реквизитов табличной части произвольного документа?
Функция СформироватьСтруктуруТабличнойЧастиДокумента(Документ, ИмяТабличнойЧасти) СтруктураТабличнойЧастиДокумента = Новый Структура; Для Каждого Реквизит из Документ.Метаданные().ТабличныеЧасти.Реквизиты Цикл СтруктураТабличнойЧастиДокумента.Вставить(Реквизит.Имя, Реквизит.Имя); КонецЦикла; Возврат СтруктураТабличнойЧастиДокумента; КонецФункции
Как получить запросом данные табличной части документа, имея структуру названий реквизитов табличной части?
Функция СформироватьЗапросПоТабличнойЧасти(Документ, ИмяТабличнойЧасти, СтруктураПолей) Экспорт ПоляРеквизитов = «»; Для Каждого Реквизит Из СтруктураПолей Цикл ПоляРеквизитов = ПоляРеквизитов + «, Док.» + Реквизит.Значение + ?(ЗначениеНеЗаполнено(Реквизит.Ключ), «», » КАК » + СокрЛП(Реквизит.Ключ)); КонецЦикла; Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | Док.НомерСтроки » + ПоляРеквизитов + » |ИЗ | Документ.» + Документ.Метаданные().Имя + «.» + СокрЛП(ИмяТабличнойЧасти) + » КАК Док |ГДЕ | Док.Ссылка = &ДокументСсылка»; // Установить параметры запроса. Запрос.УстановитьПараметр(«ДокументСсылка», Документ.Ссылка); Возврат Запрос.Выполнить(); КонецФункции