Программисту, имеющего немного опыта на платформе 1С 8.2, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта, а-а-а-а-аааа!!.....
Именно такое сложное чувство непонимания было поначалу и у меня. В процессе обучения и реального опыта была создана эта шпаргалка, целью которой было "разложить всё по полочкам", чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи объектов.
Для чего нам вообще нужны эти обработчики?
Очень часто программисту требуется переопределить стандартное поведение системы во время записи объектов, а именно: отменить запись, в случае каких-то условий; запросить дополнительную информацию у пользователя; дозаполнить реквизиты; что-то ещё записать в базу данных на основании этой записи; что-то изменить на форме после записи и т.д. и т.п. Каждый программист рано или поздно сталкивается с подобными задачами, потому знать назначение и последовательность запуска этих событий программисту, работающему на платформе 1С 8.2, необходимо.
В модуле формы или в модуле объекта?
Сначала надо определиться нужны ли нам данные формы? Будет ли запись записываться программным способом или только интерактивно? Будем ли вести диалог с пользователем?
Дело в том, что часть событий выполняется на уровне модуля формы и это значит, что они выполняются только при интерактивной записи, а также в этих событиях мы можем обращаться к данным формы, вести диалог с пользователем.
Другая часть событий выполняется на уровне модуля объекта, как при интерактивной, так и при программной записи.
Потому можно сразу определиться с обработчиком модуля формы или модуля объекта будем работать.
Модуль формы: на клиенте или на сервере?
Далее, если выбран модуль формы, то надо определиться какой обработчик потребуется: исполняемый на клиенте, или исполняемый на сервере. Если потребуется диалог с пользователем, то на клиенте, в противном случае на сервере. Их можно отличить по имени директивы компиляции или по имени обработчика (когда на сервере, это пишется в имени, например ПередЗаписьюНаСервере()).
Как выбрать конкретный обработчик?
Выбор зависит от поставленной задачи. Что конкретно можно делать в каждом обработчике опишу ниже, а пока пример.
Пример выбора обработчиков событий записи объекта:
Бывают задачи, когда потребуется использовать несколько обработчиков для решения одной задачи. Например, надо запросить информацию у пользователя во время записи: «Будем создавать новый документ на основании этой записи?» и, если пользователь ответит утвердительно, то надо создать новый документ с ссылкой на записываемый объект. Причем запись нового документа надо выполнять в транзакции, т.к. если текущая запись по каким то причинам будет отменена, то и уже созданный и записанный документ не должен остаться в базе данных.
Для решения этой задачи потребуется использовать обработчики события модуля формы по двум причинам:
1) Диалог с пользователем возможен только на клиенте, а клиентеские обработчики есть только в модуле формы. Для диалога будем использовать клиентскую процедуру модуля формы ПередЗаписью(), и сохраним ответ пользователя в параметре этой процедуры «ПараметрыЗаписи».
2) А в процедуре ПриЗаписиНаСервере() модуля формы примем этот параметр и в зависимости от него будем создавать документ или нет. Почему именно эта процедура? Ссылка будет получена только после записи, но поскольку нам нужно записывать в транзакции, то нужно использовать процедуры ДО завершения транзакции, но уже имеющие ссылку на записываемый объект. ПередЗаписью() не подходит , так как ещё нет ссылки, а ПослеЗаписи() не подходит, так как транзакция уже завершена. Остаётся ПриЗаписи(), но перед нами встаёт выбор: модуля формы или модуля объекта? Поскольку обработчик события ПриЗаписи() модуля объекта не содержит параметр, содержащий ответ пользователя, а событие ПриЗаписиНаСервере() модуля формы содержит, то ответ очевиден-используем это событие ПриЗаписиНаСервере() модуля формы потому что:
1) Это событие выполняется в транзакции 2) Содержит параметр «ПараметрыЗаписи», в котором уже содержится ответ пользователя, который передался из процедуры ПередЗаписью() 3) Ссылка уже создана и можно создавать новый документ, используя эту ссылку.
Ну и теперь последовательность запуска событий (в том порядке, в каком они перечислены) и небольшие подробности :
Во многих обработчиках есть параметр «Отказ». Там, где этот параметр присутствует означает, что в этом обработчике ещё можно отказаться от записи, присвоив параметру «Отказ» значение Истина, и тогда запись произведена не будет. 1) Модуль формы ПередЗаписью(Отказ, ПараметрыЗаписи)
Выполняется на клиенте!
Этот обработчик следует использовать, если необходимо организовать диалог с пользователем перед тем, как записать объект. Запросить дополнительную информацию, предупредить о чём-либо, дать возможность отказаться и т.п.
Второй параметр этого обработчика «ПараметрыЗаписи» имеет тип «Структура». У документов эти параметры заполняются системой предопределенными параметрами РежимЗаписи, РежимПроведения. Можно добавить свои.
Эти параметры передаются между событиями формы ПередЗаписьюНаСервере, ПриЗаписиНаСервере, ПослеЗаписиНаСервере, где их можно благополучно использовать. Например, при записи регистра сведений, надо сделать запись в другой регистр сведений старое значение ресурса. Можно передать старое значение в эти самые параметры и уже в ПриЗаписиНаСервере сделать запись в другой регистр. 2) Модуль формы ОбработкаПроверкиЗаполненияНаСервере(Отказ, ПроверяемыеРеквизиты)
3) Модуль объекта ОбработкаПроверкиЗаполнения (Отказ, ПроверяемыеРеквизиты)
Эти два обработчика проверки заполнения реализуются через параметр «ПроверяемыеРеквизиты» типа Массив, содержащий реквизиты, которые надо проверять (т.е. которым установлено свойство проверки заполнения «Выдавать ошибку»)
И если из этого массива убрать реквизит, то проверяться он не будет, если добавить, то будет выполняться проверка заполнения.
Таким образом, можно сказать, что эти два обработчика событий предназначены :
Для включения в проверку заполнения тех реквизитов, у которых в свойствах «ПроверкаЗаполнения» указано «Не проверять». Для этого надо добавить этот реквизит в массив параметр «ПроверяемыеРеквизиты»
Для того, чтобы исключить из автоматической проверки реквизиты, у которых установлено свойство проверки заполнения «Выдавать ошибку» в зависимости от каких-то условий. Для этого надо удалить этот реквизит из массива параметра «ПроверяемыеРеквизиты»
Имеется несколько особенностей, которые необходимо учитывать:
Если у формы из которой записывается объект в свойствах не установлено «ПроверятьЗаполнениеАвтоматически», то тогда эти обработчики проверки заполнения не вызываются и проверки не происходят!
Вызываются только при интерактивной записи! При программной записи не вызываются. Для проверки нужно использовать метод объекта ПроверитьЗаполнение(), который инициирует запуск этих событий.
Для документов, имеющих возможность проведения , эти события проверки заполнения вызываются только при проведении!
Оба эти события выполняются на сервере, отличие в том, что ОбработкаПроверкиЗаполненияНаСервере() это событие модуля формы и, следовательно, есть доступ к данным формы. А ОбработкаПроверкиЗаполнения() - событие модуля объекта. 4) Модуль формы ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
В этом обработчике можно дозаполнять реквизиты объекта или провести дополнительные проверки. Есть доступ к данным формы. Есть параметр ТекущийОбъект.
Параметр ТекущийОбъект имеет тип класса «объект» в зависимости от типа записываемого объекта (СправочникОбъект,ДокументОбъект и т.д). Т.е. экземпляр класса объект создан, и можно обратиться к его свойствам и методам, но в базу данных ещё не записан. Начало транзакции 5) Модуль объекта ПередЗаписью(Отказ)
В этом обработчике можно дозаполнять реквизиты объекта или провести дополнительные проверки.
Для документов в параметры данного обработчика добавляются ещё два параметра:РежимЗаписи, РежимПроведения. Запись 6) Модуль объекта ПриУстановкеНовогоНомера(СтандартнаяОбработка, Префикс)
Возникает в момент, когда выполняется установка номера нового документа, задачи или бизнес-процесса.
Или ПриУстановкеНовогоКода(СтандартнаяОбработка,Префикс)
Возникает в момент, когда выполняется установка нового кода элемента справочника, узла плана обмена или кода плана видов характеристик.
Эти событии вызываются для объектов у которых указано свойство «Автонумерация» и только для новых объектов.
Если установить параметру СтандартнаяОбработка значение Ложь, то новый номер генерироваться не будет и можно программно задать код объекта в данном обработчике. 7) Модуль объекта ПриЗаписи(Отказ)
Вызывается после записи объекта в базу данных, но до окончания транзакции записи.
Ссылка уже есть и можно записать в базу данных дополнительные данные на основании текущего объекта, используя эту ссылку.
Например, при записи создавать другой документ, содержащий реквизит ссылку на записываемый. 8) Модуль формы ПриЗаписиНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи)
Вызывается после записи объекта в базу данных, но до окончания транзакции записи. Есть доступ к данным формы. Есть последний шанс отказаться от записи.
Параметр ТекущийОбъект имеет тип класса «объект» в зависимости от типа записываемого объекта (СправочникОбъект,ДокументОбъект и т.д). Можно обратиться к его свойствам и методам. Завершение транзакции 9) Модуль формы ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
Выполняется на сервере.
Можно использовать для того, чтобы визуально что-то отобразить на форме. 10) Модуль формы ПослеЗаписи(ПараметрыЗаписи)
Выполняется на клиенте!
Можно использовать для того, чтобы визуально что-то отобразить на форме или выдать предупреждение пользователю.
Для понимания особенностей записи и проведения документа в форме следует, прежде всего, разделять особенности записи самого объекта (ДокументОбъект) и особенности работы расширения формы. Расширение формы документа действует, если основной реквизит формы имеет тип ДокументОбъект. Оно обеспечивает специфическую функциональность формы при редактировании и записи документа. Задача расширения заключается в реализации удобного для пользователя поведения формы. Но собственно запись и проведение документа выполняет, разумеется, объект, являющийся реквизитом формы. Расширение документа обрабатывает различные команды пользователя, выполняет предварительные проверки и другие сервисные действия, а затем вызывает запись объекта. Запись объекта выполняется так же, как и если бы она вызывалась средствами встроенного языка. То есть с точки зрения объекта запись в форме и запись средствами языка ничем не различаются. Таким образом, расширение обеспечивает некоторую сервисную функциональность, обращаясь в конечном итоге к функциональности объекта. Следует учитывать, что расширение формы действует, только если используются механизмы формы и не действует, если выполняется обращение непосредственно к объекту. Например, если вызвать метод Записать() у объекта ДокументОбъект, то никакие действия расширения формы не будут выполняться. Чтобы они выполнялись нужно вызывать метод ЗаписатьВФорме().
Далее мы рассмотрим те сервисные действия, которые обеспечивает расширение формы документа. В данном разделе, мы опишем только те действия, которые специфичны именно для расширения формы документа и не будем касаться общих действий, которые поддерживаются расширениями всех объектов.
Установка даты документа
При открытии формы нового документа, если дата документа не установлена (равна значению типа Дата по умолчанию), то документу устанавливается рабочая дата. Следует заметить, что используется именно рабочая дата, а не текущая (если не установлено использование текущей даты в качестве рабочей). Это дает возможность пользователю настроить рабочую дату так, чтобы новые документы вводились определенной датой. При этом в качестве даты устанавливается начало дня (дата без времени), даже если в качестве рабочей даты выступает текущая дата. Но если свойство АвтоВремя имеет значение НеИспользовать, и рабочая дата равна текущей, то устанавливается текущая дата, вместе со временем. Таким образом, для варианта АвтоВремя = НеИспользовать при открытии берется рабочая дата (если она отличается от текущей) или текущая дата вместе со временем, а для остальных вариантов установка времени откладывается на момент записи документа.
При записи нового документа в форме если свойство АвтоВремя имеет значение отличное от НеИспользовать, и не используется оперативное проведение, и время документа пустое (0:00:00), то выполняется автоматическая установка времени на основании значения свойства АвтоВремя. Действие расширения формы в этом случае аналогично вызову метода УстановитьВремя() с вариантом выбранном в свойстве АвтоВремя и с использованием журналов документа.
Расширение формы так же предоставляет команды для установки времени документа в начало дня, конец дня, перед предыдущим и за последующим документом.
Установка режима записи
При нажатии кнопки "ОК", если для документа в метаданных разрешено проведение, документ записывается в режиме проведения.
Кроме того, расширение формы предоставляет две отдельные команды для записи с проведением и записи с отменой проведения.
При любой записи документа в форме, если установлено свойство расширения формы ПриЗаписиПерепроводить и документ проведен, то выполняется запись в режиме проведения. Это позволяет исключить ситуацию, когда пользователь изменит документ, а движения документа не будут обновлены.
Установка режима оперативного проведения
При записи документа в форме, расширение формы выполняет установку режима проведения (оперативное или неоперативное проведение). Установка выполняется по следующему алгоритму.
Вначале если свойство ИспользоватьРежимПроведения имеет значение Авто выполняется первичный подбор режима проведения из вариантов Оперативный, Неоперативный и Запрашивать.
Если у пользователя нет права на неоперативное проведение – используется оперативное проведение.
Если документ не проведен – используется оперативное проведение.
Если дата документа равна текущей, а время меньше или равно текущему, то используется режим Запрашивать. Здесь и далее в этой статье сравнение даты имеется в виду без учета времени, а сравнение времени описывается отдельно.
Если дата документа меньше текущей, то используется неоперативное проведение.
Если дата документа равна текущей и время больше текущего – используется оперативное проведение.
Дальнейшие действия системы определяются уже исходя из трех вариантов (Оперативный, Неоперативный и Запрашивать) установленных непосредственно в свойстве ИспользоватьРежимПроведения или на основании описанного алгоритма для варианта Авто.
Если дата документа меньше текущей, используется оперативный режим и у пользователя есть права на неоперативное проведение, то пользователю предлагается использовать неоперативный режим. Если пользователь отказывается, то запись документа отменяется.
Если дата документа меньше текущей, используется оперативный режим и у пользователя нет права на неоперативное проведение, то запись документа отменяется.
Если дата документа меньше текущей и используется режим Запрашивать, то в зависимости от наличия прав на неоперативное проведение или выбирается неоперативный режим (без запроса пользователя), или запись документа отменяется.
Если дата документа больше текущей и используется оперативный режим, то запись документа отменяется. Штатное поведение расширения формы не разрешает проведение документа завтрашней датой, даже если у пользователя есть права на неоперативное проведение. Это объясняется тем, что после появления документов проведенных завтрашней датой текущие остатки регистров используемых проводимыми оперативно документами перестают соответствовать реальным остаткам и механизм оперативного проведения для всех пользователей перестает работать адекватно.
Далее если используется режим Запрашивать, то пользователю выдается диалог с выбором режима проведения.
Полученный таким образом режим проведения (Оперативный или Неоперативный) используется при выполнении записи документа.
Проверка прав
При открытии формы документа, если документ проведен, а у пользователя нет права "Интерактивное изменение проведенных", то расширение переводит форму в режим ТолькоПросмотр.
При записи документа в форме выполняется проверка прав на интерактивное проведение и интерактивную отмену проведения в соответствии с текущим режимом записи.
Считывание движений
При открытии формы документа, если есть табличные поля, связанные с движениями (наборами записей) объекта редактируемого в форме, то эти движения считываются из базы данных и соответственно отображаются в табличных полях.
Была поставлена задача посчитать время простоя автомобиля в часах за интервал, но при этом исключить ночное время, придумал такое решение...
Может комуто пригодится
Алгоритм обработки выполняет запрос к регистру сведений "курсы валют" за определенный пользователем период. Полученные данные выборки в цикле выводятся в элемент экранной формы "диаграмма" в режиме построения графика. Для элемента управления "Диаграмма" на этапе конфигурирования был задан тип - График, и имя - "График Курсов". Это наиболее наглядный и простой пример работы с графиками в 1С 8.1.
Внешний вид и органы управления показаны на рисунке:
Алгоритм процедуры рисования графика:
- Очистить старые данные графика;
- Сформировать текст запроса;
- Установить значения периода выборки;
- Выполнить запрос;
- Подготовить структуру соответствия серий и валют, которые будут изображены на графике;
- В цикле заполнить значения точек графика для всех используемых валют;
- В цикле, используя ранее установленные значения графика для валют, добавить серию графика бивалютной корзины;
- Обновить данные графика курсы валют экранной формы;
Использование элемента Диаграмма в 1С
Алгоритм обработки использует в качестве параметра элемент НастройкаПериода, значения которого используются в запросе к регистру сведений "Курсы валют".
Исходный код:
Далее в процедуре "Нарисовать", осуществляющей вывод данных запроса в диаграмму экранной форме, обозначена структура для работы с валютами и ряд подготовительных действий. Переменная курсы будет использоваться для связи с элементом управления Диаграмма, расположенным на экранной форме. Перед работой будут очищены текущие данные диаграммы и отлючена перерисовка значений в момент нового формирования и насыщения данными. Структура "серии" потребуется для связи названия валюты (ключ) и серии (значение) диаграммы, как на моменте инициализации, так и при выводе данных. Так же при создании серий диаграммы производится отключение маркеров.
Далее необходимо выполнить запрос и перейти к формированию диаграммы. Следующая часть процедуры заполняет значение точек для серий диаграммы, добавленных в цикле инициализации серий графика. Если точек диаграммы не было создано ранее, они создается. Алгоритм рассчитан для работы с курсами валют в течении года, если нужен больший период механизм создания точек следует переделать либо в запросе, либо в данном цикле. Номер серии, используемый при выводе значения точки диаграммы, находится при помощи структуры ключ и значение по названию валюты, полученному для текущей строки выборки запроса.
Получение значения точки уже построенного графика в элементе диаграмма можно при помощи функции "ПолучитьЗначение". Для использования этой функции нужно знать серию и точку диаграммы. После вычисления значения графика бивалютной корзины диаграмму нужно обновить:
Данные курсов можно загрузить штатным загрузчиком 1С с сайта РБК, для этого можно воспользоваться справочником "Валюты" нажав пункт меню "Загрузить курсы":
При построении графика предполагается наличие в справочнике данных следующих валют: EUR, GBP, USD, Руб. После открытия формы для загрузки данных курсов валют нужно указать интервал требуемых данных - например с 2000 по 2010 год и нажать на кнопку "Заполнить", затем на кнопку "Загрузить". В данном примере курсы валют будут загружены с сайта РБК:
После добавления необходимого состава валют и загрузки их курсов по отношению к рублю за нужный период можно пользоваться построителем, текст которого приведен выше. Для ускорения вывода данных дополнительные проверки не вводились, по этому, если нет требуемых данных, внешняя обработка вызовет ошибку выполнения.
Сохранение диаграммы, графиков и гистограмм в виде картинки
Построенные в диаграмме графики можно сохранить средствами 1С в один из поддерживаемых форматов: BMP
EMF
GIF
Icon
JPEG
PNG
TIFF
WMF
Пример процедуры для экспорта диаграммы в графический формат:
Управление бизнес-процессами предприятия подразумевает под собой использование процессной модели управления организацией, когда отдельные деловые операции связываются в логические цепочки. Такой подход реализуется на методологической базе концепции Workflow (управление потоками работ). В классическом понимании данной концепции акцент делается на документах, в то время как управление бизнес-процессами увязывает воедино документы (информацию), людей и приложения (средства обработки информации). Автоматизация управления бизнес-процессами позволяет повысить качество организации работы и эффективность управления предприятием.
* Повышение качества. Бизнес-процессы формулируют и реализуют правила выполнения отдельных операций и их взаимосвязь, что позволяет значительно сократить или даже полностью исключить из бизнес-процесса ошибки, обуславливаемые человеческим фактором. Простой список заданий позволяет сотрудникам сконцентрироваться на своих непосредственных обязанностях.
* Повышение эффективности. С помощью механизма бизнес-процессов можно формализовать организационную деятельность и возложить функции управления совместной работой сотрудников на прикладное решение, что ведет к более эффективному использованию рабочего времени.
* Обеспечение новых возможностей. Данные о выполнении задач и о ходе бизнес-процессов могут служить основой для оптимизации организационной структуры предприятия, выявления “узких” мест и скрытых ресурсов. Таким образом, в полной мере реализуется методология процессного управления.
В составе технологической платформы «1С:Предприятие 8» имеется блок для реализации механизмов бизнес-процессов. Данный блок включает в себя инструментарий для автоматизации цепочек связанных операций, направленных на достижение общей цели. Механизм бизнес-процессов обеспечивается сразу несколькими объектами конфигурирования: бизнес-процессы, задачи, регистр сведений и параметр сессии. Задача предназначена для учета заданий и описывает способ их распределения по исполнителям с учетом организационной структуры предприятия. Адресация заданий сотрудникам определяется реквизитами, в которых можно предусмотреть многомерную ролевую маршрутизацию, например по ролям, рабочим группам, подразделениям, помещениям, филиалам и т. д. При этом задачи могут создаваться не только бизнес-процессами, но и другими объектами информационной базы и непосредственно пользователями. Более того, в общем случае исполнителем задания может быть не только сотрудник, но и любая внешняя система, например другая учетная система. Объект «Бизнес-процесс» описывает логику выполнения операций для достижения той или иной цели и управляет жизненным циклом созданных бизнес-процессов (их экземпляров) от момента старта до момента завершения. Логика бизнес-процесса (взаимосвязь и последовательность обхода точек маршрута, условные переходы и пр.) наглядно описывается в виде карты маршрута, которая позволяет визуально описывать маршрут бизнес-процесса в виде связного графа и позволяет легко описывать алгоритмы условных переходов и реакцию бизнес-процесса на различные события. Операции, выполняемые в ходе бизнес-процесса, представлены на карте маршрута точками действий, которые содержат информацию о том, кто и что должен сделать на данном этапе. Исполнитель может определяться персонально (Иванов) или с учетом ролевой маршрутизации ("Кладовщик", "Бухгалтер"). При переходе бизнес-процесса на точку действия он автоматически формирует задачи, устанавливая в них предусмотренные реквизиты адресации.
В большинстве случаев для установки 1C:Предприятия 8.х в варианте “клиент-сервер” достаточно запуска программы установки 1С:Предприятия 8.х. При этом сервер 1С:Предприятия получает стандартные значения параметров, необходимые для его нормального функционирования.
Рассмотрим установку сервера 1С:Предприятия более детально. В процессе установки сервера 1С:Предприятия 8.х программа установки 1С:Предприятия 8.х выполняет следующие действия:
* Копирует загрузочные модули сервера 1С:Предприятия в каталог, указанный программе установки 1С:Предприятия в качестве конечной папки.
* Если в процессе установки выбрано "Создать пользователя USR1CV81", то создает пользователя USR1CV81. От имени этого пользователя работает сервер 1С:Предприятия 8.1, если он запускается как сервис. Ему доступны только те ресурсы, которые необходимы серверу 1С:Предприятия. Важно, что серверу 1С:Предприятия для работы необходимы два каталога: общий каталог с данными сервера (обычно "C:\Program Files\1cv81\server") и каталог временных файлов (обычно "C:\Documents and Settings\usr1cv81\Local Settings\Temp" или "C:\WINNT\Temp"). Пользователь USR1CV81 получает права на общий каталог с данными сервера. Каталог временных файлов обычно доступен всем пользователям.
* Если в процессе установки включено "Установить сервер 1С:Предприятия 8.1 как сервис Windows", то регистрирует в Windows сервис агента сервера 1С:Предприятия и запускает его. При первом запуске создается кластер серверов 1С:Предприятия с настройками по умолчанию. В нем один рабочий сервер и один рабочий процесс. Адрес рабочего сервера совпадает с именем компьютера, на котором выполнена установка.
Пользователь USR1CV81 или USR1CV82 и его права
Сервер 1С:Предприятия является серверным приложением работа которого не должна зависеть от того, какой пользователь вошел в серверный компьютер в интерактивном режиме, если вообще кто-нибудь вошел. Поэтому при установке сервера 1С:Предприятия желательно создать специального пользователя USR1CV81, наделенного правами, минимально необходимыми для сервера 1С:Предприятия, и не предназначенного для интерактивного входа. Сервер 1С:Предприятия представляется системе Windows пользователем USR1CV81.
Рассмотрим подробнее права, устанавливаемые пользователю USR1CV81. Сервер 1С:Предприятия использует следующие каталоги:
* Каталог загрузочных модулей находится в каталоге, заданном программе установки 1С:Предприятия в качестве конечной папки. В нем расположены загрузочные модули сервера 1С:Предприятия. Пользователь USR1CV81 необходимы права на чтение данных и запуск программ из этого каталога и его подкаталогов. Он получает эти права неявно, благодаря включению в группу Users.
* Каталог данных сервера обычно имеет имя "C:\Program Files\1cv81\server". Пользователю USR1CV81 необходимы полные права на этот каталог. Программа установки 1С:Предприятия при создании пользователя USR1CV81 наделяет его правами на этот каталог.
* Каталог временных файлов обычно имеет имя "C:\Documents and Settings\usr1cv81\Local Settings\Temp" или "C:\WINNT\Temp", которое определяется значением переменной TEMP окружения пользователя или переменной TEMP системного окружения. Посмотреть значение этой переменной можно в диалоге System Properties (Start -> Settings -> Control Panel -> System -> Advanced -> Environment Variables). Программа установки 1С:Предприятия задает пользователю USR1CV81 полные права на этот каталог. Обычно при установки Windows каталог временных файлов доступен всем пользователям посредством включения в его список доступа группы CREATOR OWNER. Однако, это доступ не полный. В частности, всем пользователям не доступна операция поиска файлов в этом каталоге. Установка пользователю USR1CV81 полных прав на каталог временных файлов позволяет серверу 1С:Предприятия выполнять все необходимые ему операции. Посмотреть список доступа можно в диалоге свойств каталога на закладке Security. Наличие группы CREATOR OWNER позволяет обращаться к каталогу любому пользователю, создающему какие-нибудь файлы в этом каталоге или владеющему какими-нибудь файлами в этом каталоге. При этом в списке доступа созданного файла вместо группы CREATOR OWNER будет записан пользователь, создавший файл. Среди пользователей, которым разрешен доступ в этот каталог, должен быть и пользователь USR1CV81, наделенный полными правами на этот каталог.
Важно иметь в виду, что каталог временных файлов определенного пользователя (в том числе и пользователя USR1CV81) определяется комбинацией переменных окружения этого пользователя и системных переменных окружения. Чтобы узнать этот каталог, программа установки 1С:Предприятия запрашивает контекст пользователя USR1CV81. В для этого в Windows 2000 пользователю, от имени которого запускается программа установки 1С:Предприятия, могут потребоваться привилегии: Act as part of the operating system и Bypass traverse checking. Проверить привилегии пользователя можно утилитой Local Sequrity Settings в ветке Local Policies -> User Rights Assignment. В процессе установки нового программного обеспечения программа установки обычно получает эти привилегии автоматически.
Регистрация сервера 1С:Предприятия как сервиса Windows
Сервер 1С:Предприятия является простым консольным Windows приложением и может быть запущен интерактивно. Однако для постоянного использования это неудобно, поскольку ставит запуск сервера 1С:Предприятия от входа итнерактивного пользователя в серверный компьютер. Чтобы исключить эту зависимость, сервер 1С:Предприятия может запускаться как сервис Windows. Для этого он должен быть зарегистрирован в менеджере сервисов Windows.
Для просмотра списка сервисов Windows и их параметров предназначена утилита Component Services (Start -> Settings -> Control Panel -> Administrative Tools -> Services). Сервер 1С:Предприятия представлен в списке сервисов сервисом "Агент сервера 1С:Предприятия 8.1". Параметры сервиса определяют запуск процесса "Агент сервера 1С:Предприятия" (ragent), пользователя, от имени которого он запускается, а также способ перезапуска в аварийных ситуациях.
В диалоге свойств сервиса "Агент сервера 1С:Предприятия 8.1" на закладке General показана строка запуска процесса ragent, который является Агентом сервера 1С:Предприятия. Обычно эта строка имеет вид: "C:\Program Files\1cv81\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv81\server"
В ней указано, что:
* процессом Агента сервера является загрузочный модуль "C:\Program Files\1cv81\bin\ragent.exe";
* процесс ragent запускается как сервис Windows и должен управляться менеджером сервисов (-srvc);
* используется как Агент сервера 1С:Предприятия (-agent);
* при первом запуске сервиса должен быть создан кластер с параметрами по умолчанию и главным IP-портом номер 1541 (-regport 1541). По этому порту клиентские приложения должны соединяться с информационными базами, зарегистрированными в кластере;
* IP-порт агента сервера должен иметь номер 1540 (-port 1540). По этому порту Консоль кластера должна соединяться с центральным сервером для выполнения административных функций;
* при запуске процессов кластера на данном сервере им будут динамически назначаться IP-порты из диапазона 1560-1591 (-range 1560:1591).
* общие данные кластера будут размещены в каталоге "C:\Program Files\1cv81\server" (-d "C:\Program Files\1cv81\server").
Сервис "Агент сервера 1С:Предприятия 8.1" может быть добавлен или удален не только при установке или удалении 1С:Предприятия программой установки 1С:Предприятия 8.1, но и вручную. Для этого можно исполнить из командной строки утилиту ragent, указав ей соответствующие параметры.
Для создания сервиса нужно указать параметр -instsrvc и параметры: -usr - имя пользователя, от имени которого должен быть запущен сервис, -pwd - пароль этого пользователя. При этом остальные параметры станут параметрами строки запуска Агента сервера 1С:Предприятия как сервиса. Например, для стандартной регистрации сервиса Агента сервера 1С:Предприятия в отладочном режиме набор параметров должен быть таким:
Для удаления сервиса нужно указать параметр -rmsrvc. Например: "C:\Program Files\1cv81\bin\ragent.exe" -rmsrvc
Иногда бывает полено изменить строку запуска Агента сервера или другие параметры сервиса Агента, например, включить режим отладки, или создать несколько сервисов разных версий. Диалог свойств сервиса не позволяет редактировать строку запуска сервисного приложения и некоторые другие параметры, например, идентификатор сервиса. Для редактирования потребуется утилита regedit, предназначенная для просмотра и редактирования системного реестра Windows.
Внимание! Редактирование системного реестра Windows требует крайней осторожности, поскольку ошибочные изменения в нем могут привести операционную систему в неработоспособное состояние.
Запустите утилиту regedit (откройте Start -> Run и наберите regedit) и выберите ветку: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.1 Server Agent
Среди ее параметров есть параметр ImagePath, значением которой является строка запуска Агента сервера 1С:Предприятия. Здесь можно добавить новые параметры строки запуска или поменять значения существующих. Полный список возможных параметров приведен в книге "1С:Предприятие 8.1 Клиент-сервер" документации.
При необходимости регистрации нескольких независимых сервисов Агента сервера 1С:Предприятия нужно указать им разные загрузочные модули, разные порты и разные каталоги данных кластера. Еще требуется зарегистрировать их с разными идентификаторами сервисов. Это можно сделать так:
* Создать первый сервис: "C:\Program Files\1cv81\bin\ragent.exe" -srvc -agent -regport 1541 -port 1540 -range 1560:1591 -d "C:\Program Files\1cv81\server"
* При помощи утилиты regedit изменить идентификатор зарегистрированного сервиса. Для этого: выбрать ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.1 Server Agent
и изменить ее имя, например на: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.1 Server Agent First
* Создать второй сервис: "C:\Program Files\1cv81_10\bin\ragent.exe" -srvc -agent -regport 1641 -port 1640 -range 1660:1691 -d "C:\Program Files\1cv81_10\server"
* Быть может, его идентификатор тоже изменить. Для этого: выбрать ветку HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.1 Server Agent
и изменить ее имя, например на: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\1C:Enterprise 8.1 Server Agent Second
Что не может сделать программа установки 1С:Предприятия?
Как уже говорилось, программа установки 1С:Предприятия копирует загрузочные модули 1С:Предприятия и выполняет необходимую регистрацию в COM и в менеджере сервисов Windows. Выше приведена информация, необходимая для понимания внутренних механизмов этой регистрации. Если на серверном компьютере установлен не только сервер, но и клиентская часть 1С:Предприятия, то она готова к работе сразу после установки (и подключения ключей защиты).
Чтобы сервер 1С:Предприятия был доступен с других компьютеров в локальной сети, необходимо проверить сетевые настройки на серверном и клиентском компьютере, а также для сети в целом. Для передачи данных между клиентскими приложениями и сервером 1С:Предприятия, а также между процессами кластера серверов используется TCP/IP. От правильности его настройки зависит работа 1С:Предприятия в варианте клиент-сервер.
Процессы кластера серверов 1С:Предприятия соединяются друг с другом по адресам, определенным в качестве значений свойства "Компьютер" диалога свойств рабочих серверов. Для кластера необходимо, чтобы значением свойства "Компьютер" был либо IP-адрес в точечной нотации, либо такой символический адрес, по которому может быть определен IP адрес при помощи функции gethostbyname, определенной в программном интерфейсе протокола TCP. Определение IP-адреса выполняется либо на основании локальной таблицы символических адресов (C:\WINNT\system32\drivers\etc\hosts), либо по таблицам адресов в доступных DNS серверах. Если по символическому адресу рабочего сервера его IP-адрес не определяется или определяется неправильно (например, IP-адрес не совпадает с фактическим IP-адресом данного компьютера), то кластер работать не будет. Важно, чтобы имена компьютеров и их адреса, определенные в Windows на каждом из рабочих серверов кластера, не противоречили их именам в DNS.
На каждом рабочем сервере процессы кластера используют следующие порты: IP порт рабочего сервера (обычно 1540); IP порты из диапазонов IP портов рабочего процесса (обычно 1560-1591). Кроме того, на центральном сервере кластера используется порт кластера (обычно 1541). Если в системе используются сетевые экраны, то передача данных по этим портам должна быть разрешена. Вместо разрешения портов из приведенного списка можно разрешить передачу данных процессам кластера (ragent, rmngr, rphost).
Соединение клиентского приложения 1С:Предприятия с сервером выполняется в 2 этапа. Сначала оно устанавливает соединение с менеджером кластера. При этом используется адрес центрального сервера (символический или числовой) и порт кластера (обычно 1541). Далее клиентское приложение устанавливает соединение с одним из рабочих процессов. В качестве его адреса используется значение свойства "Компьютер" соответствующего рабочего сервера и порт рабочего процесса, который выбирается из диапазона IP портов рабочего сервера. Передача данных на эти порты должна быть разрешена во всех сетевых экранах на маршруте от компьютера клиентского приложения до компьютеров кластера серверов 1С:Предприятия. Определение IP адреса серверных процессов выполняется при помощи функции gethostbyname на компьютере клиента. Важно, чтобы имена центрального и рабочих серверов и их адреса, определенные в Windows на каждом из серверов кластера, не противоречили их именам в DNS, доступном компьютеру клиента.
И последнее. Очевидно, что для успешного доступа к серверу 1С:Предприятия с других компьютеров он должен быть в сети и должны быть выполнены необходимые для этого настройки. Подключение к сети и методика настройки относятся к администрированию сетей на базе Microsoft Windows и описаны в соответствующих инструкциях.
Особенности настройки SQL-сервера
1С:Предприятие в варианте «клиент-сервер» использует для хранения данных SQL-сервер. При этом к SQL-серверу обращается только Сервер 1С:Предприятия. Клиенты 1С:Предприятия непосредственного доступа к SQL-серверу не имеют. Установка и настройка SQL-сервера подробно описана в документации по Microsoft SQL Server. Для успешной работы Сервера 1С:Предприятия с SQL-сервером необходимо обратить особое внимание на следующие настройки.
* Необходимые компоненты SQL-сервера. Для доступа к SQL-серверу со стороны Сервера 1С:Предприятия на компьютере Сервера 1С:Предприятия должны быть установлены компоненты Microsoft Data Access 2.6 или более поздний.
* Аутентификация пользователя SQL-сервером. Права доступа к базам данных SQL-сервера определяются пользователем, от имени которого происходит обращение к базам данных. С компьютера, на котором установлен SQL-сервер, запустим утилиту SQL Server Enterprise Manager, найдем узел Local (Console Root -> Microsoft SQL Servers -> SQL Server Group -> (Local)) и откроем его свойства. На закладке Sequrity можно видеть, что SQL-сервер поддерживает два способа аутентификации пользователей: SQL Server and Windows и Windows only. Аутентификация Windows позволит Серверу 1С:Предприятия обращаться к SQL-серверу только от имени пользователя USR1CV81, что не позволяет различать права доступа до различных информационных баз, обслуживаемых одним сервером 1С:Предприятия. Рекомендуется выбирать режим SQL Server and Windows. В этом случае обращение к конкретной информационной базе будет выполняться от имени пользователя, который задан в качестве пользователя SQL-сервера при создании данной информационной базы. Важно, что этот пользователь должен иметь не только полные права на базу данных информационной базы, но и права на создание баз данных в SQL-сервере и на чтение таблиц базы данных Master.
* Сетевые протоколы для доступа к SQL-серверу. Если Сервер 1С:Предприятия и SQL-сервер размещены на разных компьютерах, то необходимо выполнить настройки сетевых протоколов доступа к SQL-серверу. Это можно сделать при помощи утилиты SQL Server Client Network Utility. На закладке General можно выбрать список сетевых протоколов, используемых для доступа к SQL-серверу. Наиболее быстрым и универсальным является использование протокола TCP/IP. При использовании других протоколов необходимо иметь в виду, что некоторые из них, например Named Pipes, выполняют дополнительную аутентификацию средствами Windows при обмене данными с SQL-сервером. В этом случае для успешной работы с SQL-сервером на компьютере с SQL-сервером должен быть зарегистрирован пользователь USR1CV81, наделенный соответствующими правами. Протокол доступа к данному SQL-серверу может быть изменен на закладке Alias.
Если Вы работаете с одной таблицей, то Вам нет необходимости использовать объединение. Совсем другое дело, когда Вы работаете с несколькими таблицами и Вам, например, нужно получить данные, и по покупкам и по продажам товаров.
Для объединения используется предложение ОБЪЕДИНИТЬ. На самом деле происходит объединение результатов запросов, то есть каждый запрос собирает данные независимо друг от друга, а затем эти результаты объединяются в один. И только над последним запросом выполняются остальные операции, например, упорядочивание и расчет итогов.
При объединении запросов происходит "вертикальное склеивание" результатов, то есть сначала идут строки результата первого запроса, затем второго.
Перейдём к практике:
Результат этого запроса следующий:
Номенклатура Количество Сумма
Бумага А4 25 14 500
Стикеры 500л 8 4 880
Файл прозрачный 5 4 100
Набор офисный 8 8 840
В итоге мы получим две таблицы, которые будут соединены друг с другом. Трудно увидеть, где кончается документ Приходная и начинается документ Расходная. Но мы сделаем кое-что, чтобы понять это:
Как видно из текста запроса мы задали для каждого документа разные псевдонимы для количества и суммы. Также на место тех полей, где мы будем получать значения суммы и количества, поставим нули. Это нужно, чтобы пустые значения количества и суммы заменялись нулями.
Номенклатура КолПриход СумПриход КолРасход СумРасход
Бумага А4 25 14 500
Стикеры 500л 8 4 880
Файл прозрачный 5 4 100
Набор офисный 8 8 840
Набор офисный 1 1 105
Файл прозрачный 1 820
Стикеры 500л 1 610
Теперь нам нужно из результат запроса убрать дублирующиеся элементы. У нас два запроса и если мы будем сворачивать, каждый отдельно, чтобы исключить дублирующиеся элементы, то у нас ничего не получится. Поэтому мы приведём запрос к следующему виду:
Итак, мы видим, что весь наш запрос заключён в скобки и назван как ВложенныйЗапрос. Это сделано для того, чтобы мы смогли сгруппировать записи из обоих подзапросов и исключить дублирующиеся элементы. Такая конструкция называется вложенным запросом. Результат этого запроса следующий:
Номенклатура КолПриход СумПриход КолРасход СумРасход
Бумага А4 25 14 500
Стикеры 500л 8 4 880 1 610
Набор офисный 5 4 100 1 1 105
Файл прозрачный 8 8 840 1 820
В итоге получаем сгруппированную таблицу, в которой данные из вложенных подзапросов приведены к понятному виду. Количество вложенных запросов не должно превышать 255. Мы использовали здесь четыре подзапроса.
Если мы хотим оставлять в запросе только уникальные значения записей при этом, не используя группировку. Нужно писать предложение ОБЪЕДЕНИТЬ без ключевого слова ВСЕ.
Предложение ДЛЯ ИЗМЕНЕНИЯ позволяет заблаговременно заблокировать некоторые данные (которые могут читаться транзакцией другого соединения) уже при считывании, чтобы исключить взаимные блокировки при записи. ДЛЯ ИЗМЕНЕНИЯ дает возможность указать в запросе таблицы, считываемые данные которых предполагается изменять. В этом случае другое соединение будет ожидать освобождения этих данных уже в момент считывания внутри транзакции, т.е. не сможет прочесть заблокированные данные до тех пор, пока не будет завершена транзакция, наложившая блокировку. Блокировка от изменения данных считываемых в транзакции выполняется независимо от предложения ДЛЯ ИЗМЕНЕНИЯ. Это значит, что если внутри какой-либо транзакции считаны некоторые данные, то из другого соединения эти данные не могут быть изменены до тех пор, пока блокировка не будет снята. Если запрос выполняется вне транзакции, то в нем могут быть считаны и заблокированные данные.
Блокировки устанавливаются в момент выполнения запроса, сбрасываются же при окончании транзакции. В случае если запрос выполняется вне транзакции предложение ДЛЯ ИЗМЕНЕНИЯ игнорируется.
В случае если после предложения ДЛЯ ИЗМЕНЕНИЯ отсутствуют имена таблиц, блокироваться будут считанные данные из всех таблиц, задействованных в запросе. В случае указания конкретных таблиц будут блокироваться только данные из перечисленных таблиц. Для блокировки можно указывать только таблицы верхнего уровня (т.е. не табличные части), участвующие в запросе. Должны приводиться именно имена таблиц, а не их псевдонимы, определенные в запросе. В случае указания виртуальной таблицы будут блокированы данные из всех таблиц, задействованных в виртуальной таблице. При указании виртуальной таблицы следует записывать ее имя без параметров.
Пример использования предложения ДЛЯ ИЗМЕНЕНИЯ можно посмотреть в типовой конфигурации "Управление торговлей" в модуле документа РеализацияТоваров, в функции СформироватьЗапросПоШапке(Режим), которая вызывается из обработчика проведения документа. В этой функции, в случае оперативного проведения выполняется запрос, в котором накладывается блокировка на регистр остатков:
Часто запуск 1С Предприятия тормозит работа антивирусной программы. Многие антивирусные программы проверяют на лету запускаемые и открываемые файлы. Больше всех тормозит программы 1С Антивирус Касперского. В нем и в большинстве таких программ можно настроить исключение по маске (т.е. указать, какие файлы проверять не надо). Для нормальной работы 1С надо исключить следующие файлы: *.DBF и *.CDX - таблицы с данными и индексные файлы, *.MD - файл конфигурации, *.USR - файлы с данными о пользователях.