PostgreSQL напрямую "из коробки" применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблицу сразу. Если нужны блокировки на уровне записей, включаем в 1С режим управляемых блокировок и прописываем их в конфигурации ручками. Вывод: необходимо скачать специальный дистрибутив с сайта 1С или взять на диске ИТС.
Установка
Сама установка особых затруднений не вызывает, обратить внимание нужно на правильную инициализацию базы данных, а именно настройку локали, изменить потом это можно только повторной начальной инициализацией. Например, база 1С с украинскими региональными установками в СУБД с установленной русской локалью не загрузится. Да и проблемы с сортировкой потом не нужны. Поэтому делаем init в соответствии с нужным языком.
5.Удаляем службу PostgreSQL, которая была установлена в ходе установки.
sc delete pgsql-9.1.2-1.1C-x64
Где pgsql-9.1.2-1.1C-x64 – Это название службы. Если не знаете название точно, можно посмотреть свойствах службы “PostgreSQL Database Server…” (Пуск – Панель управления – Администрирование – Службы )
6.Создаем новый сервис с указанием нашего кластера
7.Теперь заходим в службы. Пуск – Панель управления – Администрирование – Службы и стартуем нашу службу.
Ошибка СУБД: ERROR: new encoding (UTF8) is incompatible with the encoding of the template database (WIN1251).
HINT: Use the same encoding as in the template database, or use template0 as template.
Вы выбрали неправильную локаль при установке СУБД (WIN1251) для сервера и клиента, нужно изменить на UTF-8 в конфигурации или переустановить СУБД со следующими параметрами:
Внимание при установке НЕ выбирайте локаль Настройки ОС, выбирайте из списка Russian, Russia
Настройка PostgreSQL
Следует помнить о рекомендации 1С не использовать в запросах конструкции ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ и заменять его, используя, например, комбинацию из нескольких левых соединений. Известна также проблема с потерей производительности в запросах, где применяется соединение с виртуальной таблицей СрезПоследних, к ней рекомендуется делать отдельные запросы и сохранять результаты во временных таблицах.
Настройка конфигурации производится редактированем файла postgresql.conf.
Наиболее важные параметры
effective_cache_size = 0,5 от ёмкости RAM
fsync = off отключаем сброс на диск после каждой транзации (Внимание! Применять только при использовании надежного UPS, есть опасность потери данных при неожиданном отключении)
synchronous_commit = off отключаем синхронную запись в лог (риски теже, что и у fsync)
wal_buffers = 0,25 от ёмкости RAM
После настройки не забываем выполнить перезапуск службы:
service postgresql restart
Настройка сети
Для подключения клиентов 1С к серверу извне и работы сервера баз данных, на файрволе, должны быть открыты следующие порты:
Агент сервера (ragent) & tcp:1540 Главный менеджер кластера (rmngr) & tcp:1541 Диапазон сетевых портов, для динамического распределения рабочих процессов & tcp:1560&1591, tcp:5432 & Postgresql. Создадим правило через стандартный интерфейс, либо с помощью команды:
Теперь с другого компьютера мы спокойно запускаем клиент 1С:Предприятия, добавляем существующую информационную базу newdb. Не забываем про лицензии, программной / аппаратной защиты.
Батник на "языке 1С" для клиент серверных баз, скачивает с сайта ИТС нужное обновление, бекапит базу и обновляет. Подойдет как рабочая заготовка для собственных "обновляторов". В текущем виде все работает. Надо только занести свои переменные.
Периодически во встроенном языке возникает необходимость изменения текста запроса в зависимости от разных алгоритмических условий. Раньше подобная задача решалась путём непосредственного формирования нужного текста запроса в виде строки. А это не всегда удобно и зачастую очень громоздко.
Теперь во встроенном языке мы реализовали объектную модель схемы запроса. Вы можете создать пустую схему запроса конструктором и загрузить в неё имеющийся текст запроса. После этого отдельные элементы текста запроса будут доступны вам как свойства объектной модели.
На рисунке ниже стрелки показывают, в каких объектах встроенного языка будут доступны те или иные элементы простого запроса, загруженного в схему:
Редактирование текста запроса с помощью объектной модели позволяет вам проще и понятнее модифицировать имеющиеся запросы. Или даже создавать их во встроенном языке «с нуля». А затем просто получать готовый текст запроса из схемы методом ПолучитьТекстЗапроса().
ПереместитьФайл(<ИмяФайлаИсточника>, <ИмяФайлаПриемника>) Параметры:
<ИмяФайлаИсточника> (обязательный) - Полное имя файла-источника (полное исходное имя файла).
<ИмяФайлаПриемника> (обязательный) - Полное имя файла-приемника (полное новое имя файла). Описание: Выполняет перемещение (переименование) указанного файла. Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). Примечание: Допускается использование схем http, https и ftp для адресации файлов. При использовании этих схем в адресах необходимо указывать прямые слеши '/', а не обратные '\'.
Для работы метода на веб-клиенте необходимо предварительно подключить расширение работы с файлами.
На веб-клиенте метод работает только с локальными файлами.
Пример:
Часто при ведении учета в различных конфигурациях 1с возникает необходимость выполнения обмена данных. Для решения этой задачи принято использовать Универсальный обмен данными XML или другие внешние обработки, общим у которых является использование текстовых файлов посредников.
Я предлагаю использовать Web-сервисы 1с. В чем необходимость обмена: Обмен данными между базами требуется для исключения дублирующих вводов одних и тех же данных в различных учетных системах. В чем необходимость обмена в режиме online: Обмен в онлайн режиме требуется когда функции учета комплекса учетных систем выполняются в разных учетных системах.
1. Например компания использует: CRM систему учета, для ведения учета взаимоотношений с клиентами; БП 2.0 для ведения взаиморасчетов с клиентами в разрезе счетов; Счета выставляемые клиентам создаются в торговой базе, а оформление заказов поставщикам исходя из потребности клиентов в базе ориентированной на работу с пайсами поставщиков. При таком разделенном построении учета, для выставления счета в одной из баз к примеру требуется завести карточку клиента в другой базе с тем чтобы данные о контрагенте так же были доступны в базе со счетами.
2. Помимо синхронизации первичных данных, может возникнуть необходимость построения сводного отчета по данным из нескольких баз, что тоже потребует обращения к внешним данным в online режиме.
Вариант автоматизации данного процесса с использованием файлов обмена, потребует подключения обработчика ожиданий, что сможет обеспечить обмен данными только с установленной задержкой времени обмена, кроме того любая обработка ожидания будет не эффективно использовать машинное время.
Обращение к Web сервисам, возможно при возникновении любых событий (ПриЗаписи, ПриПроведении, при нажатии кнопки и т.д.). при этом не возникнет ни какой задержки реакции информационной базы к которой происходит обращение, (в отличие от запуска еще одного приложения 1с в качестве com объекта).
Итак рассмотрим вариант реализации синхронизации элементов справочников, начнем с наиболее простого со справочника "Товары" в базах "Продажи" и "Закупки". Синхронизация для начала будет односторонней, предположим что перечень товаров заводится в базе "Продажи", а в "Закупки" он передается.
Что нам потребуется для того чтобы задача возникла и могла быть решена.
1. Сервер 1с, с установленной web компонентой;
2. веб-сервер (например IIS 6.0);
3. Две или более конфигурации учетных систем.
Что нам потребуется для решения задачи.
1. Создадим в базе "Закупки" Web-сервис "Синхронизация", и добавим ему Операцию "СинхронизироватьТовар", со строковыми параметрами.
1. "GuidТовара" - сюда будем передавать уникальный идентификатор товара присвоенный в базе Продаж.
2. "GuidРодителя" - уникальный идентификатор родителя данного товара.
3. "стрСтруктураРеквизитов" - Структура реквизитов товара в виде примитивных типов (число,строка,дата,булево) преобразованная в строку.
4. "этоГруппа" - реквизит котрый позволит нам не раскрывая всей структуры реквизитов товара узнатья явлется ли товар группой и соответственно его обработать.
5. "стрТаблицаЕденицИзмерения" - Таблица содержащая описание доступных единиц измерения для товара
Далее потребуется опубликовать данный сервис на веб сервере. для этого нужно будет создать текстовый файл "wssinhron.1cws", в каталоге сайта опубликованном на веб сервере. Библиотека wsisapi.dll, должна быть подключена. Проще всего корректную настройку работы веб сервера с 1с можно провести опубликовав веб приложение через конфигуратор Администрирование->"Публикация на веб сервере". Единственным минусом является, то что в версии 8.2 файлы веб сервисов *.1cws, сами не создаются. Возможно просто мне не хватает знаний по этому вопросу но для публикации веб сервисов я пользуюсь блокнотом.
Также следует учесть что на серверах 64x следует использовать wsisapi.dll из поставки 1с 64x, даже если сам сервер 1с у вас 86x.
Итак создаем файл "wssinhron.1cws" с текстом.
{Название вашего сервера 1с}";Ref="{Назваение базы. у нас это "Market"}";"/>
Далее перейдем в модуль обработки нашего Сервиса, для наглядности я приведу пример кода своей разработки
Теперь, как вызвать веб сервис не зациклив при этом систему.
в нашем справонике "Товары" в базах "Продажи" и "Закупки" нам потребуются служебные реквизиты. 1. "GUIDтовара" - строковый реквизит (50)
2. "ВремяСинхронизации" - Реквизит с типом Дата и Время
3. "Синхронизирован" - тип булево.
В модуль объекта Справочника добавим предопределенные обработчики событий "ПередЗаписью()", "ПриЗаписи()" функцию "Синхронизация()" и общую переменную "передавать", и под текстом модуля присвоим этой переменной значение Истина. Перем передавать Экспорт;
Процедура ПередЗаписью(Отказ)
Процедура ПриЗаписи(Отказ)
Функция Синхронизация()
передавать = истина;
Таким образом получится что при любой инициализации модуля наша переменная всегда имеет значение истина.
Рассмотрим наши процедуры:
Таким образом остается добавить в событие формы элемента "ПриЗаписи()"
И мы сможем записывать наш элемент сколько угодно раз не вызывая зацикливания.
Для варианта двусторонней синхронизации, (когда элемент справочника может редактироваться в обоих базах) нам потребуется скопировать наш веб сервис из базы закупок в базу продаж переименовав имя файла публикации и URI пространство имен и внести соответствующие изменения в вызов веб сервиса из базы продаж в базу закупок и опубликовать его. Важно: При успешном срабатывание вызванного сервиса из базы "Продажи", в качестве результата работы должен быть возвращен уникальный идентификатор элемента справочника из базы "Продажи". Данный результат необходимо будет присвоить соответсвующиму реквизиту справочника из базы закупок.
Аналогично приведенному примеру можно синхронизировать данные любого справочника или документа.
Построение сводных отчетов
Для получения сводного отчета нам также потребуется вызов веб сервиса из какой - либо базы. Данный веб сервис должен будет возвращать преобразованною в строку, таблицу с данными которые мы хотим использовать в нашем отчете (Например таблицу содержащую "Код товара" и "Актуальную цену поставщика на данный товар"). Далее можно преобразовать эту строку в таблицу и использовать в качестве вложенной временной таблицы любом запросе к базе "Продажи" с соединением по Коду. Исключением является использование данной таблицы в Построителе отчетов, для случая построителя нам понадобится создание, дополнительного справочника с предопределенным элементом и табличной частью, с реквизитами соответствующими полям таблицы.
Автор: allert73
Чтобы обратиться к предопределенному значению перечисления на клиенте нужно использовать метод глобального контекста ПредопределенноеЗначение (PredefinedValue) Синтаксис:
Параметры: <ИмяПредопределенногоЗначения> (обязательный)
Тип: Строка. Содержит полный путь до предопределенного значения, включая имя самого значения. Например, "ПланСчетов.Основной.Счет41".
Синтаксис описания предопределенного значения совпадает с синтаксисом оператора ЗНАЧЕНИЕ языка запросов:
<Тип предопределенного значения>.<Имя объекта метаданных>.<Значение>
Тип предопределенного значения> может быть:
Справочник (Catalog);
ПланВидовХарактеристик (ChartOfCharacteristicTypes);
ПланСчетов (ChartOfAccounts);
ПланВидовРасчета (ChartOfCalculationTypes);
Перечисление (Enum);
БизнесПроцесс (BusinessProcess)
В качестве <Имя объекта метаданных> указывается имя объекта метаданных, как оно задано в конфигураторе.
Для перечислений, определенных в конфигурации, <Значение> указывается как имя соответствующего объекта метаданных типа ЗначениеПеречисления. Для всех остальных типов предопределенных значений <Значение> указывается как имя предопределенного элемента данных, как оно указано в конфигураторе, или ПустаяСсылка для указания пустой ссылки.
Для точек маршрутов бизнес-процессов имя предопределенного значения имеет вид:
БизнесПроцесс.<Имя объекта метаданных>.ТочкаМаршрута.<Имя точки маршрута>
Также метод может быть использован для получения значения системного перечисления. В этом случае параметр формируется как:
<ИмяСистемногоПеречисления>.<ИмяЗначенияСистемногоПеречисления>
Описание: Возвращает ссылку на предопределенный элемент из предопределенных данных, прикладных перечислений и точек маршрута бизнес-процессов, а также значения системных перечислений.
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Вызов метода выполняет обращение к серверу.
Программируя функционал в платформе 8.2 Управляемые Формы нужно четко понимать где он будет исполняться (на сервере или клиенте). Многие привычные методы теперь не работают так как раньше. И элементарная проверка заполнения реквизита на предопределенное значение на клиенте будет иметь следующий вид:
СправочникМенеджер.<Имя справочника>.ПолучитьИмяПредопределенного (CatalogManager.<Имя справочника>.GetPredefinedItemName)
СправочникМенеджер.<Имя справочника> (CatalogManager.<Имя справочника>) ПолучитьИмяПредопределенного (GetPredefinedItemName)
Синтаксис:
Параметры: <Ссылка> (обязательный)
Тип: СправочникСсылка. Ссылка на элемент, имя которого требуется получить.Возвращаемое значение:
Тип: Строка.
Описание: Получает имя предопределенного элемента. Если данный элемент не является предопределенным, то возвращается пустая строка.
Доступность: Сервер, толстый клиент, внешнее соединение.
Вариант 1: ОкноКлиентскогоПриложения (ClientApplicationWindow)
ПолучитьНавигационнуюСсылку (GetURL)
Синтаксис:
Возвращаемое значение:
Тип: Строка.
Описание: Получает навигационную ссылку в формате 1С:Предприятия на текущую форму.
Доступность: Тонкий клиент, веб-клиент, толстый клиент, внешнее соединение.
Вариант 2: Глобальный контекст (Global context)
ПолучитьНавигационнуюСсылку (GetURL)
Синтаксис:
Параметры: <Объект> (обязательный)
Тип: Ссылка на объект информационной базы. Ссылка на объект. <ИмяРеквизита> (необязательный)
Тип: Строка. Имя реквизита объекта или ресурса Регистра сведений, для которого нужно выяснить ссылку. Если это реквизит табличной части объекта, то параметр указывается как <имя табличной части>.<имя реквизита>, то есть с разделителем "." (точка).
<Индекс> (необязательный)
Тип: Число. Индекс строки в табличной части, в том случае если объект является реквизитом табличной части. Первая строка имеет индекс равный 0.
Возвращаемое значение: Тип: Строка.
Описание: Получает текст ссылки на объект информационной базы или его реквизит в формате 1С:Предприятия.
В первом случае принимает в качестве параметра ссылку на объект (это может быть как ссылка, так и ключ записи регистра сведений). Объектом могут быть: справочник, документ, ключ записи регистра сведений, бизнес процессы, задачи.
Во втором, в качестве параметров принимает ключ объекта (это может быть как ссылка, так и ключ записи регистра сведений) и имя реквизита (ресурса). Если нужно получить ссылку на реквизит табличной части, перед именем реквизита необходимо добавить имя табличной части и точку ".".
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Примечание: Выполняет обращение к серверу только при получении ссылки на реквизит. При получении ссылки на объект информационной базы запрос на сервер не выполняется.
Получить навигационную ссылку для константы?
Вопрос: В конфигурации есть константа с типом ХранилищеЗначения для хранения изображения. Пытаюсь реализовать Загрузку и Выгрузку изображения: СсылкаНаКартинку = ПолучитьНавигационнуюСсылку(Константы.Логотип.Получить());
где СсылкаНаКартинку - реквизит формы с типом строка, а на форме есть элемент, у которого путь к данным = СсылкаНаКартинку
Возможно ли реализовать отображение картинки таким образом, или стоит хранить картинку где-либо еще? Ответ:
Навигационную ссылку на константу получить не получится(
Получится только так:
т.е. в процедуру ПриСозданииНаСервере поместить картинку во временное хранилище и она там сидит пока закроете форму
Есть форма списка справочника "Сотрудники".
В нем есть реквизит "Фото", который имеет тип "СправочникСсылка.ХранилищеДополнительнойИнформации" (справочник "ХранилищеДополнительнойИнформации" по структуре полностью совпадает анологичным справочником в 1С 8.1).
В реквизиты формы списка добавил "АдресКартинки" тип "строка", в элементы добавил поле "Картинка" (вид - поле картинки) с путем к данным "АдресКартинки". Как вывести Картинку?
Ответ:
"Хранилище" - это "стандартный" реквизит справочника "ХранилищеДополнительнойИнформации".
Имеется регистр сведений с именем "Изображения" следующей структуры:
Измерения:
- ИдИзображения (тип - уникальный идентификатор);
Реквизиты:
- Изображение (тип - ХранилищеЗначений)
Реализовать возможность записи изображений в него, проблемы не составило. А застрял на получении навигационной ссылки на нужную запись регистра? Ответ - Для регистра сведений первым параметром должен быть ключ записи, а не ссылка на объект.
Т.е. если есть регистр сведений ХранилищеКартинок с изменением Ном (тип справочник Ном) и ресурс Картинка (тип хранилище значений) - код для получения навигационной ссылки должен быть примерно таким:
При использовании в web-клиенте
Стояла следующая задача: отправлять уведомления о изменениях в документах на почту и вкладывать в письмо гиперссылку на измененный документ. База опубликована на web-севере. Полученная в 1С ссылка методом ПолучитьНавигационнуюСсылку() имела следующий вид https://localhost/#e1cib/data/Документы.Счет?ref="ab99005056c0000811e00f627bcddd55"
Вложенная в таком виде ссылка не открывала нужный документ, а лишь инициировала переход в базу.
Как оказалось проблема была в следующем, в URL-адресах не должны присутствовать кавычки, их заменяем на %22 https://localhost/#e1cib/data/Документы.Счет?ref=%22ab99005056c0000811e00f627bcddd55%22
УстановитьНовыйКод(<ПрефиксКода>) Параметры:
<ПрефиксКода> (необязательный)
Тип: Строка.
Строковое значение префикса. Если префикс указан, то новый код будет формироваться с учетом префикса. Описание:
Устанавливает новый код. Если в коде присутствует числовая часть, то новый код автоматически устанавливается следующим за имеющимся максимальным. При этом определяется текущий максимальный код среди элементов данного справочника.
Если передан префикс, то новый код устанавливается следующим образом: выполняется поиск максимального кода среди кодов, имеющих данный префикс, новый код выбирается как следующий от найденного кода.
Доступность:
Сервер, толстый клиент, внешнее соединение. Примечание:
Префикс имеет смысл, если для справочника в конфигураторе выбран тип кода Строка. Пример:
УстановитьНовыйНомер(<ПрефиксНомера>) Параметры:
<ПрефиксНомера> (необязательный)
Тип: Строка.
Префикс устанавливаемого номера.
Значение по умолчанию: Пустая строка Описание:
Устанавливает новый номер документа для заданного префикса номера. Доступность:
Сервер, толстый клиент, внешнее соединение. Примечание:
Для документов с нумерацией в пределах периода, номер устанавливается в пределах периода, соответствующего установленной дате документа. Если дата - пустая, процедура установит номер в пределах периода соответствующего пустой дате. Пример:
В типовой конфигурации, как правило, установка нового номера происходит через подписку на событие "ПриУстановкеНовогоНомера...". Последовательность вызова процедур, при работе через форму документа, при этом следующая:
- МодульФормы ПередЗаписью()
- МодульОбъекта ПередЗаписью()
- МодульОбъекта ПриУстановкеНовогоНомера()
- Событие(подписка) ПриустановкеНовогоНомера() (установка префиксов и номера)
- МодульОбъекта ПриЗаписи() (префиксы и номер установлены)
- Модульформы ПриЗаписи()
- МодульФормы ПослеЗаписи()
Параметры:
<Метаданные> (необязательный, НО Если значение параметра не указано, то обновление будет выполнено для всех типов объектов)
Тип:
Массив; Объекты метаданных. Объект метаданного или массив объектов метаданных, для объектов которого будет выполнено обновление. Если значение параметра не указано, то обновление будет выполнено для всех типов объектов.
Описание:
Выполняет обновление номеров в соответствии с номерами, записанными в базе данных. После вызова данного метода все выданные, но не записанные номера, становятся невалидными, т.к. не гарантируется их уникальность. Данный метод разрешено вызывать только администратору системы.
Доступность:
Сервер, толстый клиент, внешнее соединение
Форматированный документ предназначен для оформление текста. Его можно выделить жирным, подчеркнуть, увеличить/уменьшить шрифт, центрировать и т.д. Также можно добавить картинку. Т.е. в 1С теперь можно отформатировать текст, примерно, как в MS Word и др. подобным программам. Это может быть удобно при оформлении различных договоров или, например, при редактировании электронного письма. Таким образом, у нас есть возможность привести текстовый документ в тот вид, который мы пожелаем.
В синтакс-помощнике есть описание. Объект ФорматированныйДокумент (FormattedDocument) имеет одноименный тип данных, который поддерживает функционирование данного объекта и имеет следующие методы: Вставить (I_nsert)
Добавить (Add)
Записать (Write)
ПолучитьHTML (GetHTML)
ПолучитьЗакладкуКонца (GetEndBookmark)
ПолучитьЗакладкуНачала (GetBeginBookmark)
ПолучитьЗакладкуПоПозиции (GetPositionBookmark)
ПолучитьПозициюПоЗакладке (GetBookmarkPosition)
ПолучитьТекст (GetText)
Удалить (Delete)
УстановитьHTML (SetHTML)
Доступен во всех типах приложения: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение. Нельзя указать новый тип данных в качестве типа реквизита.
Есть одна важная особенность этого типа. Нельзя задавать тип «Форматированный документ» для реквизита объекта (справочника, документа и др.). Но есть возможность указывать его для реквизитов формы.
Возникает вопрос, как же нам сохранить те изменения при форматировании текста, которые сделал пользователь? Для этого применяется специальный объект «ХранилищеЗначения», который может содержать в себе любой тип данных, в том числе и «форматированный документ». Таким образом, в базе данных сам объект будет храниться как «Хранилище значения», далее при открытии формы необходимо будет извлечь объект из хранилища, отобразить его на форме используя тип «ФорматированныйДокумент». Если пользователь решит сохранить изменения, то при записи объекта нужно снова взять объект «форматированный документ» и записать его в хранилище.
Пример работы
Возьмем за основу каркасную конфигурацию, создадим в ней справочники «Контрагенты» и «Договоры». Установим справочник «Договоры» подчиненным справочнику «Контрагенты» и создадим реквизит «Текст» с типом ХранилищеЗначения.
Создадим форму элемента справочника «Договоры» и добавим на нее новый реквизит, который назовем «ТекстДоговора», укажем тип данных «ФорматированныйДокумент». Обратите внимание, что реквизит «Текст» с типом «ХранилищеЗначения» на форму поместить нельзя.
Создадим также командную панель (меню) содержащую необходимые кнопки для управления форматированным документом. Для этого надо добавить в форму «Группа – Командная панель» и указать в свойстве «Источник команд» реквизит формы «ТекстДоговора» с типом ФорматированныйДокумент.
Запускаем отладчик, проверяем, что у нас получилось…
Все бы хорошо, но есть некоторые проблемы:
Во-первых, если ввести текст и отформатировать его должным образом, то признак модифицированности для формы не возникает. Таким образом, случайно нажав на кнопку закрытия формы, система не задавая вопросов закрывает ее без всякого сохранения.
Для того чтобы подобные неприятности не случались, необходимо установить флаг у свойства «Сохраняемые данные» реквизита формы «ТекстДоговора». В результате, при любом изменении данных в реквизите «ТекстДоговора», будет устанавливаться признак модифицированности формы, а при ее закрытии система спросит: «Сохранить изменения?».
Во-вторых. Попытаемся закрыть форму и сохранить введенные данные. Заново открыв сохраненный договор, видим что текст введенный в форму договора отсутствует. Почему так происходит?
Все дело в том, что мы делаем изменения в реквизите формы, который у нас никак не связан с реквизитом объекта. Давайте настроим связь между реквизитом формы «Текст договора» с типом данных «ФорматированныйДокумент» и реквизитом объекта «Текст» с типом «ХранилищеЗначения».
Пропишем эту связь программно в модуле формы. Опишем алгоритм.
1. При открытии формы, необходимо будет обратиться к реквизиту объекта «Текст», чтобы прочитать из него данные и записать их в форматированный документ «Текст договора».
2. При записи объекта, берем содержимое форматированного документа и помещаем его в реквизит объекта «Текст» с типом «ХранилищеЗначения».
Таким образом у нас будет возникать эффект, что все изменения производимые пользователем, будут сохраняться в базе данных.
Нам понадобятся следующие обработчики событий:
- событие ПриЧтенииНаСервере(ТекущийОбъект)
оно удобно тем, что при ошибочном внесении изменений в данные формы, можно нажать кнопку «Перечитать» и вернутся к исходным данным.
Т.к. реквизит Текст у нас имеет тип «ХранилищеЗначений», надо учесть нюансы работы с ним… В случае чтения объекта используем метод Получить(), а в случае записи используем конструктор объекта Новый ХранилищеЗначения(<Значение>, <АлгоритмСжатияДанных>).
На этом пока всё. В следующий раз попробую рассказать про использование шаблонов для вставки параметров в текст форматированного документа, например, вместо %Контрагент% вставлять наименование контрагента. Сергей (SirYozha)
Описание:
Вывести созданное сообщение в окно сообщений.
Доступность:
Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Синтаксис: Сообщить(<Текст сообщения>, <Статус>)
Параметры:
<Текст сообщения> (обязательный)
Тип: Строка. Текст сообщения.
<Статус> (необязательный)
Тип: СтатусСообщения. Статус сообщения. Определяет вид пиктограммы.
Значение по умолчанию: Обычное
Описание:
Выводит текст сообщения в окно сообщений. Если в момент вызова окно сообщений отсутствует, то будет открыто новое окно сообщений. Сообщение, в зависимости от его смысловой нагрузки, можно пометить одной из пиктограмм, входящих в предопределенный набор.
Не используется в модуле внешнего соединения.
Пример:
Синтаксис:
Сообщить(<Текст_сообщения>,<ИмиджМаркера>)
Назначение:
Вывести строку в окно сообщений. Перед сообщениями можно отображать специальные пиктограммы, которыми можно помечать сообщения различной важности.
Параметры:
<Текст_сообщения> - cтрока текста сообщения.
<ИмиджМаркера> - необязательный параметр. Строковое выражение, которое задает тип пиктограммы выводимой перед сообщением. Возможные значения:
I,
!,
!!,
!!!,
''.'' - обычное сообщение,
' ' (символ пробел) - без маркера.