Как работает sql 1с
1С умеет работать в двух режимах – файловом и серверном. При серверном варианте база данных находится не в файле, а в СУБД на сервере.
СУБД (SQL) – это система управления базами данных. Устно часто называют как «эс-ку-эль» или «скуль» или «сиквел». С 1С используются такие СУБД как MS SQL, Postgre SQL, Oracle.
Подробнее про серверный вариант работы Вы можете прочитать в уроке про сервер 1С. А здесь мы обсудим использование 1С с SQL.
Что такое SQL 1С
База данных – это набор таблиц (каждая табличка как одна страничка в Excel), в которых можно хранить данные.
Язык SQL – это способ запроса данных из этих таблиц. Язык SQL стандартизирован и практически одинаков во всех современных СУБД. Язык запросов 1С также является одним из вариантов реализации языка SQL.
СУБД – это комплекс программ и драйверов. Функции СУБД заключаются в том, чтобы самостоятельно организовать базу данных тем способом, который ей нравится (в некоторых СУБД база данных — это файл, в некоторых – раздел на диске с самостоятельной файловой системой) и обеспечить доступ к данным с помощью запросов на языке SQL.
В файловом варианте база данных 1С хранится в файле на диске и для доступа к данным 1С использует свой собственный движок. Однако этот вариант работает только для небольших баз данных и небольшого количества пользователей.
В серверном варианте базу данных 1С необходимо положить в СУБД. Клиент 1С (программа с которой работает пользователь) не соединяется напрямую к СУБД. Для трансляции запросов используется специальная программа сервер 1С (сервер приложений 1С).
Для запроса данных из SQL 1С используются запросы на языке 1С. Они могут быть использованы явно (программист написал в коде программы на языке 1С) или неявно (программист вызывает функцию платформы, которая генерит запрос или такая функция вызывается сама – в форме списка справочника/документа, например).
Сервер 1С транслирует запрос в язык SQL (соответствующую модификацию, поддерживаемую конкретным СУБД) и передает на выполнение в СУБД (SQL 1С).
Кратко о лицензировании различных СУБД
Краткая информация если Вам захочется посмотреть стоимость и в прайс-листах встретятся незнакомые слова:
- Существуют лицензии различных SQL специально для 1С (т.е. «для использования с 1С»)
- Лицензии runtime – купленный SQL можно использовать только с 1С (дешевле)
- Лицензии full-use – купленный SQL можно использовать с разными программами (дороже)
- Существуют лицензии «по количеству процессов сервера» (без ограничения количество работающих пользователей) — PVU
- Существуют комплект лицензий «по сокетам/по клиентам» — LUS
o Одна лицензия на работу SQL на сервере
o Лицензии по количеству сокетов/клиентов (т.е. на 5 соединений, на 10 соединений и т.п.).
Здесь и ниже указана очень только обзорная информация по лицензированию, так как лицензирование у всех СУБД очень сложное, есть разные ситуации, скидки, наличие/отсутствие подписки на ИТС, ограничения и правила «по умолчанию»..
Дополнительно необходимо упомянуть, что СУБД может иметь требования к операционной системе (чтобы она была тоже серверная, например, Windows Server). В варианте MS SQL так и есть, но есть и вариант «обхода» — SQL Developer Edition.
Какие SQL можно использовать с 1С
С 1С можно использовать следующие СУБД:
- Microsoft SQL
Исторически используется чаще всего. Поэтому платформа 1С работает с MS SQL полнофункционально – все типовые конфигурации разработаны именно с прикидкой на нее. - IBM DB2
Включена в поддержку недавно. Имеет особенности. - Oracle
Включена в поддержку недавно. Имеет особенности. - PostgreSQL
Включена в поддержку недавно. Имеет особенности. Полностью бесплатна (OpenSource), поэтому используется чаще остальных. Также используется в случае установки всего комплекса 1С под Linux.
Рассмотрим особенности использования разных СУБД по очереди.
Начнем с MS SQL >>
Проголосовать за этот пост:
Сервер 1С — что это и как работает

Когда в 1С одновременно работает много сотрудников, программа может «тормозить». Чтобы избавиться от этой проблемы и обеспечить быстродействие при работе с большими объемами информации и был создан сервер 1С.
Сервер 1С включает два компонента: сервер приложений, обрабатывающий данные, и SQL сервер, который хранит данные. Совместим с такими продуктами, как: Microsoft SQL Server, Linux PostgreSQL, IBM DB2. Сервер 1С выступает посредником между сервером баз данных и клиентскими компьютерами. Он берет на себя тяжелые вычислительные задачи, существенно разгружая клиентские компьютеры.
До выхода линейки версий 1C 7 понятия сервер не существовало – была просто программа 1С, которая плавно эволюционировала в «толстый клиент». Она работала с собственной файловой базой, то есть все хранили в файле на диске, или сетевом диске на другом сервере.
Файл-серверные архитектуры применяют и сейчас, но они имеют ряд ограничений. Например, трудно организовать одновременную работу нескольких пользователей, ограничен размер базы и быстродействие, а при большой номенклатуре (как у оптовиков) БД просто не справляется с запросами.
Важным развитием 1С стал переход на технологию клиент-сервер. В платформе 7.7 появилась экспериментальная SQL-версия, которая использовала для хранения базы данных и управления ею отдельную СУБД.
В 1С:Предприятие 8.0 произошло разделение на клиентские и серверные процедуры. С тех пор установка и настройка сервера 1С стали штатной возможностью.
Переходить на эту технологию целесообразно крупным и средним компаниям, когда файловая база уже не справляется, и требуется полноценная СУБД. Если в организации с 1С работает от одного до пяти пользователей, типовой конфигурации хватает для поддержки бизнес-процессов, сервер не понадобится.
Когда пользовательских сессий больше десяти, локальная сеть перегружается, что сильно замедляет параллельную работу. Например, если 1C пользуется отдел из 20 человек, плюс руководство и кассиры в точках продаж. Другой пример – оптовый поставщик. Пользователей немного – пять человек, но номенклатура товаров и список контрагентов огромны. В таких случаях сервер 1С становится необходимостью. В первую очередь, для быстродействия. Кроме того, это безопаснее – файл легко скопировать, а когда база хранится в СУБД на сервере, сделать это не так просто. Также серверная версия облегчает администрирование – один сервер обновить проще и дешевле, чем все клиентские машины.
Как работает сервер 1С
Архитектура решения может быть разной, в зависимости от целей. В общем случае она включает следующие компоненты: сервер 1С: предприятие и сервер СУБД, чаще всего MSSQL или PostgresSQL PRO. Это программные сервера, которые могут находиться как на физических, так и на виртуальных серверах, на одном или на разных. Чтобы гарантировать быстродействие, лучше использовать один.
Клиенты. Если необходимо запускать платформу на ПК (например, при использовании определенных моделей торгового и кассового оборудования) – программы-клиенты устанавливаются на рабочих устройствах. Ключи защиты вставляются в эти компьютеры, раздаются по сети специальной программой или сервером 1С.
Если установить на сервере 1С компоненты веб-сервера (входят в состав Платформы 1С), клиенты будут не нужны, можно зайти через браузер даже с мобильного.
Другой вариант – программа-клиент устанавливается на том же сервере, что и сервер 1С, или на «соседнем», а пользователи заходят по RDP.
Аренда облачного сервера для разработки, хостинга, обученияПодробнее
Сервер 1С в облаке
Построение инфраструктуры под платформу 1С предполагает большие единовременные вложения, плюс траты на обслуживание и обновление, найм ИТ-специалистов и т.д. Альтернативное решение – аренда инфраструктуры под 1С в облаке провайдера по модели IaaS. Сервер 1С на виртуальной машине обойдется значительно дешевле — нужно будет оплачивать только фактически использованные ресурсы.
Дополнительно клиент получает высокую безопасность и конфиденциальность, так как все данные хранятся в надежном и защищенном дата-центре. Ежедневное резервное копирование исключает риски потери информации. Кроме того, даже самые высоконагруженные БД 1С функционируют в облаке быстро и без сбоев, а если база выросла, можно в пару кликов ее масштабировать, заказав дополнительные ресурсы.
Пользователь имеет доступ к платформе откуда угодно, что особенно удобно для удаленных сотрудников и крупным компаниям с сетью филиалов. При этом никаких специальных технических навыков не требуется – достаточно просто подключиться к базе, причем даже с маломощного ПК, и работать в обычном режиме.
Аренда 1С в Cloud4Y
Облачный провайдер Cloud4Y предоставляет возможность работать с полнофункциональной версией 1С по подписке. Программа устанавливается на отказоустойчивый облачный сервер, клиент подключается к нему по зашифрованному интернет-каналу с любых устройств и из любой точки мира.
Как подключить 1С в облаке? Есть три варианта реализации:
Подключение к удаленному рабочему серверу (через протокол MS RDP). Сервер 1С разворачивается на площадке провайдера, при необходимости соединяется с сервером (возможно использование защищенных соединений). Пользователь подключается к удаленному виртуальному серверу по протоколу RDP и получает визуализацию того, что происходит на другом компьютере. Все вычислительные процессы происходят на сервере.
Подключение к серверу приложений. RemoteApp – это служба удаленных приложений, которая дает доступ к 1С по протоколу RDP. Чтобы настроить связь между локальным компьютером и облачной 1С таким методом, также используется клиент удаленного рабочего стола. Вычислительные процессы выполняются на сервере с использованием приложения. В отличие от RDP пользователю доступна только программа 1С, а не весь удаленный рабочий стол.
Подключение через web-браузер. Доступ к 1С через браузер, без необходимости установки на локальные ПК. Все что требуется, просто запустить браузер и перейти по адресу.
Cloud4Y также предоставляет лицензии 1С в аренду. Если у компании уже есть свои лицензии, можно использовать собственные usb-ключи.
Услуга аренды сервера 1С поможет не только сэкономить и оптимизировать работу сотрудников с программой, но и избавит от решения технических вопросов, связанных с обслуживанием инфраструктуры.
Работа с SQL. Шаблон общего модуля
В одной из последних задач появилась надобность в запросах к SQL базам из 1С. Для этого был написан общий модуль, код из которого предлагаю ниже. Думаю, для кого то это может быть не плохим подспорьем в выполнении схожих задач. Критика и моральные унижения приветствуются. Основные функции: Запрос в СУБД СоздатьДанныеДляПодключения — конструктор данных для подключения к бд. Сюда передаются логин, пароль и т.д. Используется в НовоеСоединениеССУБД. НовоеСоединениеССУБД — создает соединение с бд COMОбъект(«ADODB.Connection»). ВыполнитьЗапрос — выполняет запрос и возвращает результат типа COMОбъект. ПолучитьРезультатЗапроса — выполняет запрос и возвращает результат типа Таблица значений. ВыполнитьЗапросВ_Personnel — пример запроса к бд. ЗакрытьСоединениеССУБД — закрывает соединение с бд. СоздатьПараметрЗапроса — создает параметры для передачи в запрос. Используется в ВыполнитьЗапрос и ПолучитьРезультатЗапроса, передается в данные функции в виде результата выполнения СоздатьПараметрЗапроса, либо, для передачи нескольких параметров, массив с результатами выполнения СоздатьПараметрЗапроса. По умолчанию тип 12, что позволяет MS SQL самой попытаться подобрать тип передаваемого параметра. В самом запросе параметры указываются как «?», подставляются попорядку добавления. ВСтрокуBase64 — Используется для типа данных «adLongVarBinary 205 Long binary value», на пример, для получения данных типа image sql в формате Base64. В примере ниже используется для получения изображения из бд. Конструкторы запроса ЗапросДелет — конструктор запроса для удаления данных из бд. Для страховки, по умолчанию условия установлено в ложь. Пример использования есть ниже. ЗапросИнсерт — конструктор запроса для добавления данных из бд. Пример использования есть ниже. ЗапросДобавитьИлиОбновить_My_MS_SQL / ЗапросДобавитьИлиОбновить_Pg_SQL — конструктор запроса для добавления, или обновления данных данных из бд. Пример использования есть ниже. ФорматЧисла / ФорматБулевоPG / ФорматДатыВремяPG / ФорматДатыPG / ФорматВремяPG / ВСтроку — функции форматирования данных для SQL запросов.
Код модуля
//////////////////////////////////////////////////////////////////////////////// // Серверные процедуры и функции для работы с SQL запросами: //////////////////////////////////////////////////////////////////////////////// #Область ПрограммныйИнтерфейс #Область Конструктор_запросов_в_SQL // Возвращает строку запроса для удаления набора значений в таблице SQL. // // Параметры: // Таблица - строка - имя таблицы. // Условия - строка - условия отбора в части "WHERE". // // Возвращаемое значение: // Строка - строка запроса // Функция ЗапросДелет(Таблица, Условия = "false") Экспорт Запрос = Новый Массив; Запрос.Добавить("DELETE FROM "); Запрос.Добавить(Таблица); Запрос.Добавить(" WHERE "); Запрос.Добавить(Условия); Возврат СтрСоединить(Запрос); КонецФункции // Возвращает строку запроса для добавления набора значений в таблицу SQL. // // Параметры: // Таблица - строка - имя таблицы. // Поля - строка - имена полей через запятую. // Строки - массив строк - в каждом элементе массива находится строка со значениями полей по порядку, указанному в параметре "Поля". // Пример: Строки = Новый Массив; // Строки.Добавить("'DDD', 30, 30, 2, '20210201'"); // Строки.Добавить("'YYY', 30, 30, 2, '20210201'"); // // Возвращаемое значение: // Строка - строка запроса // Функция ЗапросИнсерт(Таблица, Поля, Строки) Экспорт Запрос = Новый Массив; Запрос.Добавить("INSERT INTO"); Запрос.Добавить(Таблица); Запрос.Добавить("("); Запрос.Добавить(Поля); Запрос.Добавить(")"); Запрос.Добавить("VALUES"); Запрос.Добавить(СобратьДобавляемыеСтроки(Строки)); Возврат СтрСоединить(Запрос, " "); КонецФункции // Возвращает строку запроса для добавления набора значений, или обновлении при наличие в таблицу SQL. // // Параметры: // Таблица - строка - имя таблицы. // Поля - строка - имена полей через запятую. // Строки - массив строк - в каждом элементе массива находится строка со значениями полей по порядку, указанному в параметре "Поля". // Пример: Строки = Новый Массив; // Строки.Добавить("'DDD', 30, 30, 2, '20210201'"); // Строки.Добавить("'YYY', 30, 30, 2, '20210201'"); // ОбновляемыеПоля - строка - поля для обновление в случае, если найдена запись по ключу // Пример: "Колонка1 = VALUES(Колонка1), Колонка2 = VALUES(Колонка2)" // "Колонка1 = VALUES(Колонка1) + VALUES(Колонка2)" // // Возвращаемое значение: // Строка - строка запроса // Функция ЗапросДобавитьИлиОбновить_My_MS_SQL(Таблица, Поля, Строки, ОбновляемыеПоля) Экспорт //"INSERT INTO `table` (`id`,`a`,`b`,`c`) VALUES (. ) ON DUPLICATE KEY UPDATE `a` = ?, `b` = ? `c` = ?"; Запрос = Новый Массив; Запрос.Добавить("INSERT INTO"); Запрос.Добавить(Таблица); Запрос.Добавить("("); Запрос.Добавить(Поля); Запрос.Добавить(")"); Запрос.Добавить("VALUES"); Запрос.Добавить(СобратьДобавляемыеСтроки(Строки)); Запрос.Добавить("ON DUPLICATE KEY UPDATE"); Запрос.Добавить(ОбновляемыеПоля); Возврат СтрСоединить(Запрос, " "); КонецФункции // Возвращает строку запроса для добавления набора значений, или обновлении при наличие в таблицу SQL. // // Параметры: // Таблица - строка - имя таблицы. // Поля - строка - имена полей через запятую. // Строки - массив строк - в каждом элементе массива находится строка со значениями полей по порядку, указанному в параметре "Поля". // Пример: Строки = Новый Массив; // Строки.Добавить("'DDD', 30, 30, 2, '20210201'"); // Строки.Добавить("'YYY', 30, 30, 2, '20210201'"); // ОбновляемыеПоля - строка - поля для обновление в случае, если найдена запись по ключу // Пример: "Колонка1 = VALUES(Колонка1), Колонка2 = VALUES(Колонка2)" // "Колонка1 = VALUES(Колонка1) + VALUES(Колонка2)" // Ключи - строка - ключевые поля через запятую по которым идет поиск для обновления // // Возвращаемое значение: // Строка - строка запроса // Функция ЗапросДобавитьИлиОбновить_Pg_SQL(Таблица, Поля, Строки, ОбновляемыеПоля, Ключи) Экспорт Запрос = Новый Массив; Запрос.Добавить("INSERT INTO"); Запрос.Добавить(Таблица); Запрос.Добавить("("); Запрос.Добавить(Поля); Запрос.Добавить(")"); Запрос.Добавить("VALUES"); Запрос.Добавить(СобратьДобавляемыеСтроки(Строки)); Запрос.Добавить("ON CONFLICT ("); Запрос.Добавить(Ключи); Запрос.Добавить(") DO UPDATE SET "); Запрос.Добавить(ОбновляемыеПоля); Возврат СтрСоединить(Запрос, " "); КонецФункции // Возвращает строку для запроса с отформатированным числом. // // Параметры: // Число - число - число, которое надо отформатировать. // // Возвращаемое значение: // Строка - строка с отформатированным числом // Функция ФорматЧисла(Число) Экспорт Возврат Формат(Число, "ЧН=0; ЧГ="); КонецФункции // Возвращает строку для запроса с отформатированным булево. // // Параметры: // Булево - булево - значение булево, которое надо отформатировать. // // Возвращаемое значение: // Строка - строка с отформатированным булево // Функция ФорматБулевоPG(Булево) Экспорт Возврат ?(Булево, "true", "false"); КонецФункции // Возвращает строку для запроса с отформатированным Дата + время. // // Параметры: // Дата - дата - значение Дата, которое надо отформатировать. // // Возвращаемое значение: // Строка - строка с отформатированным Дата + время // Функция ФорматДатыВремяPG(Дата) Экспорт ФорматДата = Формат(Дата, "ДФ=yyyyMMddHHmm; ДП=NULL"); Возврат ?(ФорматДата = "NULL", ФорматДата, ВСтроку(ФорматДата)); КонецФункции // Возвращает строку для запроса с отформатированной Датой. // // Параметры: // Дата - дата - значение Дата, которое надо отформатировать. // // Возвращаемое значение: // Строка - строка с отформатированной Датой // Функция ФорматДатыPG(Дата) Экспорт ФорматДата = Формат(Дата, "ДФ=yyyyMMdd; ДП=NULL"); Возврат ?(ФорматДата = "NULL", ФорматДата, ВСтроку(ФорматДата)); КонецФункции // Возвращает строку для запроса с отформатированным Временем. // // Параметры: // Дата - дата - значение Дата, которое надо отформатировать. // // Возвращаемое значение: // Строка - строка с отформатированным Временем // Функция ФорматВремяPG(Дата) Экспорт ФорматДата = Формат(Дата, "ДФ=HHmmss; ДП=NULL"); Возврат ?(ФорматДата = "NULL", ФорматДата, ВСтроку(ФорматДата)); КонецФункции // Возвращает строку для запроса в формате строка. // // Параметры: // Данные - произвольный - произвольное значение, которое надо отформатировать. // // Возвращаемое значение: // Строка - строка с отформатированным значением // Функция ВСтроку(Данные) Экспорт Возврат "'" + Данные + "'"; КонецФункции #КонецОбласти #Область Подключение_к_SQL #Область Готовые_решения // Выполнение текста запроса к базе Personnel и возвращает полученные данные // // Параметры: // ТекстЗапроса - строка - текст запроса. // Параметры - структура - см. СоздатьПараметрЗапроса(). // Отказ - булево - при ошибке в выполнении функции- истина // ОписаниеОшибки - строка - описание ошибки выполнения функции // // Возвращаемое значение: // Таблица значений - таблица значений с результатом запроса из базы Personnel // Функция ВыполнитьЗапросВ_Personnel(ТекстЗапроса, Параметры = Неопределено, Отказ = Ложь, ОписаниеОшибки = Неопределено) Экспорт Connection = НовоеСоединениеССУБД(СоздатьДанныеДляПодключения("172.00.0.00", "Personnel", "log", "pass"), Отказ, ОписаниеОшибки); ТЗ = ПолучитьРезультатЗапроса(ТекстЗапроса,, Connection, Параметры,, Отказ, ОписаниеОшибки); ЗакрытьСоединениеССУБД(Connection, Отказ, ОписаниеОшибки); Возврат ТЗ; КонецФункции #КонецОбласти // Возвращает структуру с данными для НовоеСоединениеССУБД(). // // Параметры: // АдресСервера - строка - адрес сервера. // ИмяБД - строка - текст имя базы данных. // Логин - строка - логин. // Пароль - строка - пароль. // ТипСУБД - строка - тип субд к которой совершается подключение // "MSSQL" для microsoft sql // "PGSQL" для postgresql // Порт - строка - порт для подключения // DataSource - строка // // Возвращаемое значение: // Структура - структура с данными для подключения см. НовоеСоединениеССУБД // Функция СоздатьДанныеДляПодключения(АдресСервера, ИмяБД, Логин, Пароль, ТипСУБД = "MSSQL", Порт = 5432, DataSource = "") Экспорт Возврат Новый Структура("АдресСервера, ИмяБД, Логин, Пароль, ТипСУБД, Порт, DataSource", АдресСервера, ИмяБД, Логин, Пароль, ТипСУБД, Формат(Порт, "ЧГ=0"), DataSource); КонецФункции // Возвращает результат выполнения запроса. // // Параметры: // SQLText - текст - текст запроса. // ДанныеДляПодключения - структура - формируется в СоздатьДанныеДляПодключения(). // Connection - COMОбъект - ("ADODB.Connection") коннект к бд. // Параметры - структура - см. СоздатьПараметрЗапроса(). // LockType - число - Тип блокировки // - 1 - adLockReadOnly - записи в Recordset будут доступны только на чтение, вы не сможете их изменять. Это значение используется по умолчанию. // - 2 - adLockPessimistic - наиболее надежный с точки зрения целостности данных вид блокировки. Вы можете изменять записи в Recordset, // но при начале изменения записи она блокируется на источнике таким образом, что другие пользователи не смогут обратиться к ней ни на чтение, // ни на запись, пока вы не вызовете методы Update или CancelUpdate. // - 3 - adLockOptimistic - это значение позволяет выиграть в производительности за счет проигрыша в надежности обеспечения целостности данных. // Запись на источнике блокируется только на время выполнения метода Update. Остальные пользователи могут одновременно с вами читать и изменять данные на источнике. // - 4 - adLockBatchOptimistic - то же самое, что обычное оптимистичное, но вместо немедленного обновления по одной записи используется пакетное обновление. // В ситуации, когда изменяется большое число записей, такое решение позволяет выиграть в производительности. // ОписаниеОшибки - строка - описание ошибки выполнения функции // Отказ - булево - если передается истина, функция не выполняется, при ошибке в выполнении функции- истина // // Возвращаемое значение: // COMОбъект - COMОбъект c результатом запроса // Функция ВыполнитьЗапрос(SQLText, ДанныеДляПодключения = Неопределено, Connection = Неопределено, Параметры = Неопределено, LockType = 3, ОписаниеОшибки = Неопределено, Отказ = Ложь) Экспорт Попытка Если Connection = Неопределено Тогда Connection = НовоеСоединениеССУБД(ДанныеДляПодключения); КонецЕсли; Command = Новый COMОбъект("ADODB.Command"); Command.ActiveConnection = Connection; Command.CommandText = SQLText; Если Параметры <> Неопределено Тогда УстановитьПараметрыЗапроса(Command, Параметры); КонецЕсли; RecordSet = Новый ComObject("ADODB.RecordSet"); RecordSet.CursorLocation = 3; RecordSet.LockType = LockType; Recordset = Command.Execute(); Возврат Recordset; Исключение Отказ = Истина; ОписаниеОшибки = ОписаниеОшибки(); Возврат Неопределено; КонецПопытки; КонецФункции // Возвращает результат запроса в таблице значений. // // Параметры: // SQLText - текст - текст запроса. // ДанныеДляПодключения - структура - формируется в СоздатьДанныеДляПодключения() (необязательный). // Connection - COMОбъект - ("ADODB.Connection"), коннект к бд (необязательный). // Параметры - структура - см. СоздатьПараметрЗапроса(). // LockType - число - Тип блокировки (подробнее в функции ВыполнитьЗапрос) // Отказ - булево - если передается истина, функция не выполняется, при ошибке в выполнении функции- истина // ОписаниеОшибки - строка - описание ошибки выполнения функции // // Возвращаемое значение: // Таблица значений - таблица значений с результатом запроса // Функция ПолучитьРезультатЗапроса(SQLText, ДанныеДляПодключения = Неопределено, Connection = Неопределено, Параметры = Неопределено, LockType = 3, Отказ = Ложь, ОписаниеОшибки = Неопределено) Экспорт ТЗ = Неопределено; Если Не Отказ Тогда Recordset = ВыполнитьЗапрос(SQLText, ДанныеДляПодключения, Connection, Параметры, LockType, ОписаниеОшибки, Отказ); Если Не Отказ Тогда Попытка ТЗ = Новый ТаблицаЗначений; КоличествоПолей = RecordSet.Fields.Count; Для НомерСтолбца = 0 По КоличествоПолей - 1 Цикл //Создание и добавление колонок во временную таблицу ИмяСтолбца = RecordSet.Fields.Item(НомерСтолбца).Name; ТипКолонки = SQLТипВ1СТип(RecordSet.Fields.Item(НомерСтолбца).Type, RecordSet.Fields.Item(НомерСтолбца).DefinedSize); Если ТипКолонки = Неопределено Тогда ТЗ.Колонки.Добавить(RecordSet.Fields.Item(НомерСтолбца).Name); Иначе ТЗ.Колонки.Добавить(RecordSet.Fields.Item(НомерСтолбца).Name, ТипКолонки); КонецЕсли; КонецЦикла; Пока НЕ RecordSet.EOF Цикл //Заполнение созданной таблицы НоваяСтрока = ТЗ.Добавить(); Для ПолеСч = 0 По КоличествоПолей - 1 Цикл Поле = RecordSet.Fields.item(ПолеСч); НоваяСтрока[Поле.name] = Поле.Value; КонецЦикла; RecordSet.MoveNext(); КонецЦикла; RecordSet.Close(); Возврат ТЗ; Исключение Отказ = Истина; ОписаниеОшибки = ОписаниеОшибки(); ТЗ = Неопределено; КонецПопытки; КонецЕсли; Иначе ТЗ = Неопределено; КонецЕсли; Возврат ТЗ; КонецФункции // Возвращает структуру с данными параметра запроса для УстановитьПараметрыЗапроса. // // Параметры: // ИмяПараметра - строка - имя парамета // Тип - число - тип параметра // Размер - число - размер значения // Значение - любое - значение параметра // // Возвращаемое значение: // Структура - структура с данными параметра для запроса // Функция СоздатьПараметрЗапроса(ИмяПараметра, Тип = 12, Размер = 1, Значение) Экспорт //Типы //adArray 0x2000 Combine with another data type to indicate // that the other data type is an array //adBigInt 20 8-byte signed integer 64-битное целое //adBinary 128 Binary Двоичное //adBoolean 11 True or false Boolean Булево //adBSTR 8 Null-terminated character string //adChapter 136 4-byte chapter value for a child recordset //adChar 129 String String //adCurrency 6 Currency format Денежный формат //adDate 7 Number of days since 12/30/1899 Количество дней с момента 12/30/1899 //adDBDate 133 YYYYMMDD date format Универсальный формат даты ГГГГММДД //adDBFileTime 137 Database file time База данных файлов времени //adDBTime 134 HHMMSS time format Универсальный формат времени HHMMSS //adDBTimeStamp 135 YYYYMMDDHHMMSS date/time format Дататайм как есть YYYYMMDDHHMMSS //adDecimal 14 Number with fixed precision and scale Специальный тип 1.0хЕ-28 - 1.0хЕ28 одним словом decimal //adDouble 5 Double precision floating-point Двойной точности с плавающей точкой //adEmpty 0 no value Пусто //adError 10 32-bit error code 32-битный код ошибки //adFileTime 64 Number of 100-nanosecond intervals since 1/1/1601 //adGUID 72 Globally Unique identifier //adIDispatch 9 Currently not supported by ADO В настоящее время не поддерживается ADO //adInteger 3 4-byte signed integer 32-битное целое //adIUnknown 13 Currently not supported by ADO В настоящее время не поддерживается ADO //adLongVarBinary 205 Long binary value //adLongVarChar 201 Long string value //adLongVarWChar 203 Long Null-terminates string value //adNumeric 131 Number with fixed precision and scale Число с фиксированной точности и масштаба //adPropVariant 138 PROPVARIANT automation //adSingle 4 Single-precision floating-point value 32-битное знаковое одинарной точности с плавающей точкой //adSmallInt 2 2-byte signed integer 16-битное целое со знаком //adTinyInt 16 1-byte signed integer 8-битное целое со знаком //adUnsignedBigInt 21 8-byte unsigned integer 64-битное целое беззнаковое //adUnsignedInt 19 4-byte unsigned integer 32-битное целое беззнаковое //adUnsignedSmallInt 18 2-byte unsigned integer 16-битное целое беззнаковое //adUnsignedTinyInt 17 1-byte unsigned integer 8-битное целое беззнаковое //adUserDefined 132 User-defined variable Пользовательский тип //adVarBinary 204 Binary value Двоичные значения //adVarChar 200 String //adVariant 12 Automation variant //adVarNumeric 139 Variable width exact numeric with signed scale //adVarWChar 202 Null-terminated Unicode character string Какие-то строки в юникоде //adWChar 130 Null-terminated Unicode character string Какие-то строки в юникоде Возврат Новый Структура("ИмяПараметра, Тип, Размер, Значение", ИмяПараметра, Тип, Размер, Значение); КонецФункции // Возвращает COMОбъект("ADODB.Connection") для ПолучитьРезультатЗапроса параметр Connection. // // Параметры: // ДанныеДляПодключения - структура - данные для подключения,см. СоздатьДанныеДляПодключения // Отказ - булево - при ошибке в выполнении функции- истина // ОписаниеОшибки - строка - описание ошибки выполнения функции // // Возвращаемое значение: // Структура - COMОбъект("ADODB.Connection") // Функция НовоеСоединениеССУБД(ДанныеДляПодключения, Отказ = Ложь, ОписаниеОшибки = Неопределено) Экспорт Connection = Новый COMОбъект("ADODB.Connection"); Connection.ConnectionTimeOut = 30; Connection.CommandTimeout = 220; Если ДанныеДляПодключения.ТипСУБД = "MSSQL" Тогда Connection.Provider = "SQLOLEDB"; Connection.ConnectionString = "Data Source=" + ДанныеДляПодключения.АдресСервера + ";Initial Catalog=" + ДанныеДляПодключения.ИмяБД + ";Persist Security Info=True;User ;Password=" + ДанныеДляПодключения.Пароль; ИначеЕсли ДанныеДляПодключения.ТипСУБД = "PGSQL" Тогда Connection.Provider = "MSDASQL.1"; Connection.ConnectionString = "DRIVER=;Data Source=" + ДанныеДляПодключения.DataSource + ";SERVER=" + ДанныеДляПодключения.АдресСервера + ";PORT=" + ДанныеДляПодключения.Порт+";DATABASE=" + ДанныеДляПодключения.ИмяБД + ";UID=" + ДанныеДляПодключения.Логин + ";PWD=" + ДанныеДляПодключения.Пароль+";STMT=" + "utf8"; КонецЕсли; Попытка Connection.Open(); Исключение ОписаниеОшибки = ОписаниеОшибки(); Connection = Неопределено; Отказ = Истина; КонецПопытки; Возврат Connection; КонецФункции // Возвращает Строку Base64 // // Параметры: // safeArray - COMSafeArray // // Возвращаемое значение: // Строка - строка, закодированную по алгоритму base64 // // Используется для adLongVarBinary 205 Long binary value // На паример, для получения данных типа image sql // Функция ВСтрокуBase64(safeArray) Экспорт obj = Новый COMОбъект("MSXML2.DomDocument.3.0"); helper=obj.createElement("a"); helper.DataType = "bin.base64"; helper.nodeTypedValue = safeArray; Возврат helper.text; КонецФункции // Закрывает соединение с СУБД. // // Параметры: // Соединение - COMОбъект - COMОбъект("ADODB.Connection") // Отказ - булево - если передается истина, процедура не выполняется, при ошибке в выполнении процедуры- истина // ОписаниеОшибки - строка - описание ошибки выполнения процедуры // Процедура ЗакрытьСоединениеССУБД(Соединение, Отказ = Ложь, ОписаниеОшибки = Неопределено) Экспорт Если Не Отказ Тогда Попытка Если Соединение <> Неопределено Тогда Соединение.Close(); КонецЕсли; Исключение Отказ = Истина; ОписаниеОшибки = ОписаниеОшибки(); КонецПопытки; КонецЕсли; Соединение = Неопределено; КонецПроцедуры #КонецОбласти #КонецОбласти #Область СлужебныеПроцедурыИФункции #Область Подключение_к_SQL // Устанавливает параметры запроса. // // Параметры: // Command - COMОбъект -("ADODB.Command") коннект к бд. // Параметры - структура, массив структур - структура содержит значение параметра: // ИмяПараметра - строка - имя парамета // Тип - число - тип параметра // Размер - число - размер значения // Значение - любое - значение параметра. // Процедура УстановитьПараметрыЗапроса(Command, Параметры) Если ТипЗнч(Параметры) = Тип("Структура") Тогда ДбавитьПараметр(Command, Параметры); Иначе Для Каждого Параметр Из Параметры Цикл ДбавитьПараметр(Command, Параметр); КонецЦикла; КонецЕсли; КонецПроцедуры Процедура ДбавитьПараметр(Command, Параметр) Param1 = Command.CreateParameter(Параметр.ИмяПараметра, Параметр.Тип, Параметр.Размер); Command.Parameters.Append(Param1); Param1.Value = Параметр.Значение; КонецПроцедуры Функция SQLТипВ1СТип(Num, size) ПараметрыСтроки = Новый КвалификаторыСтроки(size); Если Num = 20 Тогда Возврат Новый ОписаниеТипов("Число"); ИначеЕсли Num = 128 Тогда Возврат Новый ОписаниеТипов("Булево"); ИначеЕсли Num = 8 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); ИначеЕсли Num = 136 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); ИначеЕсли Num = 129 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); ИначеЕсли Num = 7 Тогда Возврат Новый ОписаниеТипов("Дата"); ИначеЕсли Num = 133 Тогда Возврат Новый ОписаниеТипов("Дата"); ИначеЕсли Num = 134 Тогда Возврат Новый ОписаниеТипов("Дата"); ИначеЕсли Num = 135 Тогда Возврат Новый ОписаниеТипов("Дата"); ИначеЕсли Num = 14 Тогда Возврат Новый ОписаниеТипов("Число"); ИначеЕсли Num = 0 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adEmpty 0 no value ИначеЕсли Num = 3 Тогда Возврат Новый ОписаниеТипов("Число"); // adInteger 3 4 - byte signed integer ИначеЕсли Num = 205 Тогда Возврат Неопределено; // adLongVarBinary 205 Long binary value ИначеЕсли Num = 201 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adLongVarChar 201 Long string value ИначеЕсли Num = 203 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adLongVarWChar 203 Long Null - terminates string value ИначеЕсли Num = 131 Тогда Возврат Новый ОписаниеТипов("Число"); // adNumeric 131 Number with fixed precision and scale ИначеЕсли Num = 5 Тогда Возврат Новый ОписаниеТипов("Число"); ИначеЕсли Num = 4 Тогда Возврат Новый ОписаниеТипов("Число"); // adSingle 4 Single - precision floating - point value ИначеЕсли Num = 2 Тогда Возврат Новый ОписаниеТипов("Число"); // adSmallInt 2 2 - byte signed integer ИначеЕсли Num = 16 Тогда Возврат Новый ОписаниеТипов("Число"); // adTinyInt 16 1 - byte signed integer ИначеЕсли Num = 21 Тогда Возврат Новый ОписаниеТипов("Число"); // adUnsignedBigInt 21 8 - byte unsigned integer ИначеЕсли Num = 19 Тогда Возврат Новый ОписаниеТипов("Число"); // adUnsignedInt 19 4 - byte unsigned integer ИначеЕсли Num = 18 Тогда Возврат Новый ОписаниеТипов("Число"); // adUnsignedSmallInt 18 2 - byte unsigned integer ИначеЕсли Num = 17 Тогда Возврат Новый ОписаниеТипов("Число"); // adUnsignedTinyInt 17 1 - byte unsigned integer ИначеЕсли Num = 132 Тогда Возврат Новый ОписаниеТипов("Число"); // adUserDefined 132 User - defined variable ИначеЕсли Num = 204 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adVarBinary 204 Binary value ИначеЕсли Num = 12 Тогда Возврат Новый ОписаниеТипов("Число"); // adVariant 12 Automation variant ИначеЕсли Num = 139 Тогда Возврат Новый ОписаниеТипов("Число"); // adVarNumeric 139 Variable width exact numeric with signed scale ИначеЕсли Num = 202 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adVarWChar 202 Null - terminated Unicode character string ИначеЕсли Num = 130 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); // adWChar 130 ИначеЕсли Num = 200 Тогда Возврат Новый ОписаниеТипов("Строка", , , , ПараметрыСтроки); Иначе Возврат Новый ОписаниеТипов("Строка"); КонецЕсли; КонецФункции #КонецОбласти #Область Конструктор_запросов_в_SQL Функция СобратьДобавляемыеСтроки(Строки) МассивСтрок = Новый Массив; Для Каждого ДанныеСтроки Из Строки Цикл Строка = Новый Массив; Строка.Добавить("("); Строка.Добавить(ДанныеСтроки); Строка.Добавить(")"); МассивСтрок.Добавить(СтрСоединить(Строка)); КонецЦикла; Возврат СтрСоединить(МассивСтрок, ", "); КонецФункции #КонецОбласти #КонецОбласти
Примеры использования
Получений данных из MS SQL
SQLЗапрос = " | SELECT TOP (1) [Photo] | FROM [Personnel].[dbo].[tblPersons] | Where [PFR_Nom] = ? and not [Photo] is null | order by [Person_Id] desc"; ПараметрыЗапроса = Новый Массив(); ПараметрыЗапроса.Добавить(КОРВ_РаботаСБазамиSQL.СоздатьПараметрЗапроса("PFR_Nom". "123456789")); Фото = КОРВ_РаботаСБазамиSQL.ВыполнитьЗапросВ_Personnel(SQLЗапрос, ПараметрыЗапроса); Если Фото <> Неопределено и Фото.Количество() > 0 Тогда КартинкаBase64 = КОРВ_РаботаСБазамиSQL.ВСтрокуBase64(Фото[0].Photo); //Получаю фото в Base64 для дальнейшей обработки КонецЕсли;
Запись данных в PostgreSQL
Строки = Новый Массив; Строки.Добавить("'DDD', 30, 30, 2, '20210201'"); Строки.Добавить("'YYY', 30, 30, 2, '20210201'"); ТекстЗапроса = КОРВ_РаботаСБазамиSQL.ЗапросИнсерт("public.weather", "city, temp_lo, temp_hi, prcp, date", Строки); ДанныеДляПодключения = КОРВ_РаботаСБазамиSQL.СоздатьДанныеДляПодключения("172.20.3.252", "testdb", "test", "12345678", "PGSQL",, "PostgreSQL35W"); Connection = КОРВ_РаботаСБазамиSQL.НовоеСоединениеССУБД(ДанныеДляПодключения); КОРВ_РаботаСБазамиSQL.ВыполнитьЗапрос(ТекстЗапроса,, Connection); КОРВ_РаботаСБазамиSQL.ЗакрытьСоединениеССУБД(Connection);
Добавить, или обновить записи в PostgreSQL при записи регистра сведений
Процедура ПриЗаписи(Отказ, Замещение) ДанныеДвиженийДляСинхронизации = Новый Массив; Для Каждого ЗаписьРС Из ЭтотОбъект Цикл ДобавитьДанныеДвиженияДляЗаписиВSchedules(ЗаписьРС, ДанныеДвиженийДляСинхронизации); КонецЦикла; ТекстЗапроса = SchedulesДобавитьИлиОбновить(ДанныеДвиженийДляСинхронизации); ВыполнитьЗапросВПроходную(ТекстЗапроса); КонецПроцедуры // Возвращает строку для запроса с добавляемымы данными. // // Параметры: // ЗаписьРС - запись регистра - запись для рс КОРВ_ДокументыПроходной // МассивСтрок - массив - массив куда вставляются строки для SQL // Процедура ДобавитьДанныеДвиженияДляЗаписиВSchedules(ЗаписьРС, МассивСтрок) Экспорт СобраннаяСтрока = Новый Массив; СобраннаяСтрока.Добавить(ФорматЧислаPG(ЗаписьРС.ГрафикРаботы.id)); СобраннаяСтрока.Добавить(ФорматДатыPG(ЗаписьРС.Дата)); СобраннаяСтрока.Добавить(ФорматВремяPG(ЗаписьРС.ВремяПрихода)); СобраннаяСтрока.Добавить(ФорматВремяPG(ЗаписьРС.ВремяУхода)); СобраннаяСтрока.Добавить(ФорматВремяPG(ЗаписьРС.ОбедВремяПрихода)); СобраннаяСтрока.Добавить(ФорматВремяPG(ЗаписьРС.ОбедВремяУхода)); МассивСтрок.Добавить(СтрСоединить(СобраннаяСтрока, ", ")); КонецПроцедуры // Возвращает строку запроса для добавления набора значений, или обновлении при наличие в таблицу DocPass. // // Параметры: // Строки - массив строк - в каждом элементе массива находится строка со значениями полей по порядку, указанному в параметре "Поля". // Пример: Строки = Новый Массив; // Строки.Добавить("'DDD', 30, 30, 2, '20210201'"); // Строки.Добавить("'YYY', 30, 30, 2, '20210201'"); // ОбновляемыеПоля - строка - поля для обновление в случае, если найдена запись по ключу // По умолчанию: "date = VALUES(date), time_begin = VALUES(time_begin), // time_end = VALUES(time_end), free_sign = VALUES(free_sign), // info = VALUES(info)" // Функция SchedulesДобавитьИлиОбновить(Строки) Экспорт Поля = "id, date, time_begin, time_end, dinner_begin, dinner_end"; КлючевоеПоле = "id, date"; Возврат КОРВ_РаботаСБазамиSQL.ЗапросДобавитьИлиОбновить_Pg_SQL("public.""Schedules""", Поля, Строки,ПолучитьОбновляемыеПоляТаблицы(Поля, КлючевоеПоле), КлючевоеПоле); КонецФункции // Возвращает результат выполнения запроса. // // Параметры: // SQLText - текст - текст запроса. // ПолучитьРезультат - булево - при значении истина возвращает результат запрос // Параметры - массив структур - см. КОРВ_РаботаСБазамиSQL.СоздатьПараметрЗапроса(). // // Возвращаемое значение: // COMОбъект - COMОбъект c результатом запроса // Функция ВыполнитьЗапросВПроходную(SQLText, ПолучитьРезультат = Ложь, Параметры = Неопределено) Экспорт Отказ = Ложь; //Если это копия базы, то соеденяется с тестовой базой проходной Если РегламентныеЗаданияСервер.РаботаСВнешнимиРесурсамиЗаблокирована() Тогда Connection = СоединениеСБДПроходнойТЕСТ(); Иначе Connection = СоединениеСБДПроходной(); КонецЕсли; Результат = Неопределено; ОписаниеОшибки = ""; Если ПолучитьРезультат Тогда Результат = КОРВ_РаботаСБазамиSQL.ПолучитьРезультатЗапроса(SQLText,, Connection, Параметры,, Отказ, ОписаниеОшибки); Иначе КОРВ_РаботаСБазамиSQL.ВыполнитьЗапрос(SQLText,, Connection, Параметры,, ОписаниеОшибки, Отказ); КонецЕсли; КОРВ_РаботаСБазамиSQL.ЗакрытьСоединениеССУБД(Connection); Если Отказ Тогда ЗаписьЖурналаРегистрации("Ошибка выполнения запроса в проходную", УровеньЖурналаРегистрации.Ошибка. ОписаниеОшибки); КонецЕсли; Возврат Результат; КонецФункции // Возвращает строку с полями таблицы для обновления в запросе КОРВ_РаботаСБазамиSQL.ЗапросДобавитьИлиОбновить_Pg_SQL(). // // Параметры: // ПоляТаблицы - строка - поля таблицы через запятую // Ключи - строка - ключевые поля таблицы через запятую // // Возвращаемое значение: // строка - срока обновления полей // Функция ПолучитьОбновляемыеПоляТаблицы(ПоляТаблицы, Ключи) МасивПолей = СтрРазделить(СтрЗаменить(ПоляТаблицы, " ", ""), ",", Ложь); МасивКлючей = СтрРазделить(СтрЗаменить(Ключи, " ", ""), ",", Ложь); МассивПолейЗамены = Новый Массив; Для Каждого Поле Из МасивПолей Цикл Если МасивКлючей.Найти(Поле) = Неопределено Тогда МассивПолейЗамены.Добавить("" + Поле + " = excluded." + Поле); КонецЕсли; КонецЦикла; Возврат СтрСоединить(МассивПолейЗамены, ", "); КонецФункции
Удалить данный из SQL
Процедура КОРВ_ПриЗаписи(Отказ, Замещение) ТекстЗапроса = ScheduleLinksУдалить(ЭтотОбъект.Отбор.Регистратор.Значение); ВыполнитьЗапросВПроходную(ТекстЗапроса); КонецПроцедуры Функция ScheduleLinksУдалить(Документ) Экспорт Возврат КОРВ_РаботаСБазамиSQL.ЗапросДелет("public.""ScheduleLinks""", "id = " + Документ.id + " and id_doc_type = " + ПолучитьТипДокументаВПроходной(Документ)); КонецФункции Функция ПолучитьТипДокументаВПроходной(Документ) Возврат 1; КонецФункции // Возвращает результат выполнения запроса. // // Параметры: // SQLText - текст - текст запроса. // ПолучитьРезультат - булево - при значении истина возвращает результат запрос // Параметры - массив структур - см. КОРВ_РаботаСБазамиSQL.СоздатьПараметрЗапроса(). // // Возвращаемое значение: // COMОбъект - COMОбъект c результатом запроса // Функция ВыполнитьЗапросВПроходную(SQLText, ПолучитьРезультат = Ложь, Параметры = Неопределено) Экспорт Отказ = Ложь; //Если это копия базы, то соеденяется с тестовой базой проходной Если РегламентныеЗаданияСервер.РаботаСВнешнимиРесурсамиЗаблокирована() Тогда Connection = СоединениеСБДПроходнойТЕСТ(); Иначе Connection = СоединениеСБДПроходной(); КонецЕсли; Результат = Неопределено; ОписаниеОшибки = ""; Если ПолучитьРезультат Тогда Результат = КОРВ_РаботаСБазамиSQL.ПолучитьРезультатЗапроса(SQLText,, Connection, Параметры,, Отказ, ОписаниеОшибки); Иначе КОРВ_РаботаСБазамиSQL.ВыполнитьЗапрос(SQLText,, Connection, Параметры,, ОписаниеОшибки, Отказ); КонецЕсли; КОРВ_РаботаСБазамиSQL.ЗакрытьСоединениеССУБД(Connection); Если Отказ Тогда ЗаписьЖурналаРегистрации("Ошибка выполнения запроса в проходную", УровеньЖурналаРегистрации.Ошибка. ОписаниеОшибки); КонецЕсли; Возврат Результат; КонецФункции
Файловый или клиент-серверный?
Какой режим работы в программах 1С:Предприятие 8 быстрее?
Как часто в период отчетности ваша программа 1С дает сбой в работе? Зависает или долго выполняет операцию? Возможно случалось, что вы теряли данные из-за непредвиденного отключения электроэнергии? Предлагаем разобраться, как сделать программу 1С быстрее и безопаснее.
Работа в программах 1С:Предприятие 8 может быть организована в двух режимах: файловый и клиент-серверный.
Файловый режим работы 1С
Файловый вариант работы в 1С:Предприятие 8 сможет обеспечить корректную и оперативную работу системы, если в программе будет работать одновременно не более 3 человек.
База данных в файловом режиме состоит только из одного файла. Программа 1С:Предприятие 8, которую пользователь запускает на своем компьютере, обращается к этому файлу по локальной сети. Все операции или запросы (проведение документов, формирование отчетов, поиск документов, закрытие периода и пр.) выполняются непосредственно на компьютере пользователя, что требует наличия производительной машины у каждого работающего в программе.

Схема работы в файловом режиме
Для быстрого и безошибочного функционирования системы необходимо, чтобы все действия (запросы), которые совершает пользователь программы 1С:Предприятие 8, выполнялись на компьютере, который хранит базу данных. Однако в файловом режиме работы 1С:Предприятие 8 механизм реализации запросов иной:
- Блокируется часть файла базы данных для других пользователей системы.
- Заблокированные данные перенаправляются по локальной сети к клиенту.
- Операция изменения выполняется на компьютере пользователя.
- Измененная часть файла возвращается в место хранения.
- Файл базы данных становится доступен остальным пользователям системы 1С:Предприятия 8.
Постоянный обмен большим количеством информации значительно тормозит работу всех пользователей. Чтобы ускорить работу и сделать ее стабильной, необходимо некое «звено», которое будет координировать и выполнять задачи пользователей. Такое «звено» реализовано в клиент-серверном режиме работы.
Клиент-серверный режим работы 1С (с базой данных на SQL)
Сервер – это компьютер. На нем установлена программа 1С:Сервер, которая позволяет запустить 1С:Предприятие 8 в клиент-серверном режиме. Это значит, что программа 1С, которую запускает пользователь на своем компьютере, работает с программой 1С:Сервер, а уже та, в свою очередь, работает с базой данных. В качестве инструмента управления базой данных используется СУБД – PostgreSQL, MS SQL или подобные.

Схема работы в клиент-серверном режиме
В отличии от файлового режима в клиент-серверном база данных состоит не из одного файла, а из множества разных файлов. Механизм реализации запросов пользователей в этом режиме следующий:
- 1С:Сервер распределяет запросы к нужному файлу базы данных.
- Определяет очередность выполнения операций.
- Вносит изменения в базу данных.
В этом режиме ресурсоемкие операции выполняются на сервере, в месте хранения файлов базы данных, а не на компьютерах пользователей. Таким образом, для комфортной работы в программе 1С:Предприятие 8 будет достаточно только одной мощной машины. Задача компьютеров пользователей – отражение визуальной оболочки программы. С этим справится практически любой компьютер.
Клиент-серверный вариант позволяет:
- Увеличить отказоустойчивость системы в случае экстренного отключения электропитания и большой загруженности локальной сети. Например, клиент-серверный режим работы позволяет настроить создание резервной копии базы данных каждые 30 минут прямо во время работы. Это значит, что даже если случится авария на сервере, будут потеряны данные только за полчаса, и уже через час ваша компания снова будет работать в обычном режиме.
- Ускорить работу системы за счет отсутствия необходимости в постоянной транспортировке данных между компьютерами сети.
- Предотвратить кражу данных пользователями системы 1С: Предприятие 8. База данных состоит из множества файлов, которые хранятся на сервере и управляются отдельной СУБД. Копирование файлов возможно только разрозненными частями, которые не дают какой-либо информативности. Для выгрузки базы данных в работоспособном формате необходим доступ с правами администратора к 1С:Серверу и СУБД.
- Снизить риски повреждения базы данных. База статична – хранится и изменяется на одном компьютере, а значит повреждение во время транспортировки от пользователя к пользователю исключены.
Какой режим работы 1С выбрать – файловый или клиент-серверный?
Файловый режим работы в программах 1С подойдет небольшим компаниям, где одновременно работают в программе максимум 3 пользователя с базой данных до 2Гб.
Рекомендуем использовать 1С Сервер, если выполняется хотя бы одно из следующих условий:
- база данных больше 2Гб;
- количество пользователей 3 и более.
Что нужно сделать для перехода на клиент-серверный режим работы?
- Купить программное обеспечение — лицензия для Сервера 1С:Предприятие
- Выбрать СУБД:
- PostgreSQL – бесплатная СУБД (Имеет большой ряд ограничений);
- лицензии на сервер MS SQL и клиентский доступ к MS SQL
- Настроить СУБД под работу с 1С, включая планы оптимизации и резервного копирования.
- Установить 1С:Сервер и настроить администрирование.
Хотите получать подобные статьи по четвергам?
Быть в курсе изменений в законодательстве?
Подпишитесь на рассылку
