Как декодировать (преобразовать) Unicode в 1С При разработке очередного обмена с интернет магазином через API столкнулисть что сайт возвращает ответ в виде:
Код VBS {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
из кода ясно что это JSON и используя код ПрочитатьJSON
Код 1C v 8.3 Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
В переменной ДанныеЛога будет структура в виде
В результате получилась функция с 2-мя вариантами возрата, в зависимости от того как нужно
Код 1C v 8.3 //Функция читает полученный JSON декадируя текст юникод
Функция ДекодироватьUniCodeВJSON(стрВходящая)
// стрВходящая содержит {"ok":"true","description":"\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u043a\u0430\u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d"}
Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(стрВходящая);
ДанныеЛога = ПрочитатьJSON(Чтение);
Чтение.Закрыть();
// Вариант 1 используя перебор структуры и вывод в текстовую переменную
Текст = "";
Для каждого Элемент Из ДанныеЛога Цикл
//добавим разделитель после предыдущего значения
Текст = Текст + ?(НЕ ПустаяСтрока(Текст), Символы.ПС, "");
//добавим представление ключа и значения:
Текст = Текст + Элемент.Ключ + " = " + Элемент.Значение;
КонецЦикла;
Возврат Текст; //Вернет ok = true description = Статус заказа изменен
// Вариант 2 мспользуя ЗаписьJSON
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет));
ЗаписатьJSON(Запись, ДанныеЛога,);
Возврат Запись.Закрыть(); // Вернет JSON {"ok":"true","description":"Статус заказа изменен"}
КонецФункции
На просторах интернета была найдена еще одна функция:
Код 1C v 8.3 //Параметры: Строка в Юникод (обязательный) Тип: Строка. Исходная строка.
//Возвращаемое значение: Тип: Строка. Строка обработанных символов.
//Описание: Возвращает преобразованную строку из формата Unicod.
//Автор: Александр Кияница (treedo)
Функция ПереобразоватьЮникод(Строка)
ГотововаяСтрока = "" ;
МасУкр = Новый Массив(66) ;
МасУкр[0]="А"; МасУкр[1]="Б"; МасУкр[2]="В"; МасУкр[3]="Г"; МасУкр[4]="Ґ"; МасУкр[5]="Д";
МасУкр[6]="Е"; МасУкр[7]="Є"; МасУкр[8]="Ж"; МасУкр[9]="З"; МасУкр[10]="И"; МасУкр[11]="І";
МасУкр[12]="Ї"; МасУкр[13]="Й"; МасУкр[14]="К"; МасУкр[15]="Л"; МасУкр[16]="М"; МасУкр[17]="Н";
МасУкр[18]="О"; МасУкр[19]="П"; МасУкр[20]="Р"; МасУкр[21]="С"; МасУкр[22]="Т"; МасУкр[23]="У";
МасУкр[24]="Ф"; МасУкр[25]="Х"; МасУкр[26]="Ц"; МасУкр[27]="Ч"; МасУкр[28]="Ш"; МасУкр[29]="Щ";
МасУкр[30]="Ь"; МасУкр[31]="Ю"; МасУкр[32]="Я";
МасУкр[33]="а"; МасУкр[34]="б"; МасУкр[35]="в"; МасУкр[36]="г"; МасУкр[37]="ґ"; МасУкр[38]="д";
МасУкр[39]="е"; МасУкр[40]="є"; МасУкр[41]="ж"; МасУкр[42]="з"; МасУкр[43]="и"; МасУкр[44]="і";
МасУкр[45]="ї"; МасУкр[46]="й"; МасУкр[47]="к"; МасУкр[48]="л"; МасУкр[49]="м"; МасУкр[50]="н";
МасУкр[51]="о"; МасУкр[52]="п"; МасУкр[53]="р"; МасУкр[54]="с"; МасУкр[55]="т"; МасУкр[56]="у";
МасУкр[57]="ф"; МасУкр[58]="х"; МасУкр[59]="ц"; МасУкр[60]="ч"; МасУкр[61]="ш"; МасУкр[62]="щ";
МасУкр[63]="ь"; МасУкр[31]="ю"; МасУкр[65]="я";
МасКод = Новый Массив(66) ;
МасКод[0]="0410"; МасКод[1]="0411"; МасКод[2]="0412"; МасКод[3]="0413"; МасКод[4]="0490"; МасКод[5]="0414";
МасКод[6]="0415"; МасКод[7]="0404"; МасКод[8]="0416"; МасКод[9]="0417"; МасКод[10]="0418"; МасКод[11]="0406";
МасКод[12]="0407"; МасКод[13]="0419"; МасКод[14]="041A"; МасКод[15]="041B"; МасКод[16]="041C"; МасКод[17]="041D";
МасКод[18]="041E"; МасКод[19]="041F"; МасКод[20]="0420"; МасКод[21]="0421"; МасКод[22]="0422"; МасКод[23]="0423";
МасКод[24]="0424"; МасКод[25]="0425"; МасКод[26]="0426"; МасКод[27]="0427"; МасКод[28]="0428"; МасКод[29]="0429";
МасКод[30]="042C"; МасКод[31]="042E"; МасКод[32]="042F";
МасКод[33]="0430"; МасКод[34]="0431"; МасКод[35]="0432"; МасКод[36]="0413"; МасКод[37]="0491"; МасКод[38]="0434";
МасКод[39]="0435"; МасКод[40]="0454"; МасКод[41]="0436"; МасКод[42]="0437"; МасКод[43]="0438"; МасКод[44]="0456";
МасКод[45]="0457"; МасКод[46]="0439"; МасКод[47]="043A"; МасКод[48]="043B"; МасКод[49]="043C"; МасКод[50]="043D";
МасКод[51]="043E"; МасКод[52]="043F"; МасКод[53]="0440"; МасКод[54]="0441"; МасКод[55]="0442"; МасКод[56]="0443";
МасКод[57]="0444"; МасКод[58]="0445"; МасКод[59]="0446"; МасКод[60]="0447"; МасКод[61]="0448"; МасКод[62]="0449";
МасКод[63]="044C"; МасКод[31]="044E"; МасКод[65]="044F";
тмпСтрока = "" ;
Для Счетчик = 1 По СтрДлина(Строка) Цикл
Если Лев(Строка, 1) = "\" Тогда
Если Лев(Строка, 2) = "\u" Тогда
тмпСтрока = Прав(Лев(Строка, 6),4) ;
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
СтрокаЗамены = Прав(тмпСтрока, 1) ;
тмпСтрока = СтрЗаменить(тмпСтрока,СтрокаЗамены,ТРег(СтрокаЗамены));
Если МасКод.Найти(тмпСтрока) = Неопределено Тогда
Сообщить("Код символа не найден: " + тмпСтрока) ;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + МасУкр[МасКод.Найти(тмпСтрока)] ;
КонецЕсли;
Строка = Прав(Строка, (СтрДлина(Строка)-6)) ;
Иначе
Строка = Прав(Строка, (СтрДлина(Строка)-2)) ;
КонецЕсли;
Иначе
ГотововаяСтрока = ГотововаяСтрока + Лев(Строка, 1) ;
Строка = Прав(Строка, (СтрДлина(Строка)-1)) ;
КонецЕсли;
КонецЦикла;
Возврат ГотововаяСтрока ;
КонецФункции
Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Ускорение и оптимизация настроек PostgreSQL для 1С По умолчанию PostgreSQL настроен таким образом, чтобы расходовать минимальное количество ресурсов для работы с небольшими базами до 4 Gb на не очень производительных серверах. То есть, если дело касается систем посерьезней, то вы столкнетесь с большими потерями производительности базы данных лишь потому, что дефолтные настройки могут в корне не соответствовать производительности вашего северного оборудования. Настройки выделения ресурсов оперативной памяти RAM для работы PostgreSQL хранятся в файле postgresql.conf .
Доступен как из папки, куда установлен PostgreSQL / Data, так и из pgAdmin:
В общем на начальном этапе при возникновении трудностей и замедления работы БД, заметной для глаз пользователей достаточно увеличить три параметра:
shared_buffers
Это размер памяти, разделяемой между процессами PostgreSQL, отвечающими за выполнения активных операций. Максимально-допустимое значение этого параметра – 25% всего количества RAM
Например, при 1-2 Gb RAM на сервере, достаточно указать в этом параметре значение 64-128 Mb (8192-16384).
temp_buffers
Это размер буфера под временные объекты (временные таблицы). Среднее значение 2-4% всего количества RAM
Например, при 1-2 Gb RAM на сервере, достаточно указать в этом параметре значение 32-64 Mb.
work_mem
Это размер памяти, используемый для сортировки и кэширования таблиц.
При 1-2 Gb RAM на сервере, рекомендуемое значение 32-64 Mb.
Для вступления новых значений в силу, потребуется перезапуск службы, поэтому лучше делать во вне рабочее время.
Еще два важных параметра это maintenance_work_mem (для операций VACUUM, CREATE INDEX и других) и max_stack_depth
Примеры оптимальных настроек: Hardware:
CPU: E3-1240 v3 @ 3.40GHz RAM: 32Gb 1600Mhz Диски: Plextor M6Pro postgresql.conf:
shared_buffers = 8GB work_mem = 128MB maintenance_work_mem = 2GB fsync = on synchronous_commit = off wal_sync_method = fdatasync checkpoint_segments = 64 seq_page_cost = 1.0 random_page_cost = 6.0 cpu_tuple_cost = 0.01 cpu_index_tuple_cost = 0.0005 cpu_operator_cost = 0.0025 effective_cache_size = 24GB Вариант настроек от pgtune :
Полезные запросы: Блокировки БД по пользователям
Код SQL select a.usename, count(l.pid) from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid where not(mode = ‘AccessShareLock’) group by a.usename;
Вывести все таблицы, размером больше 10 Мб
Код SQL SELECT tableName, pg_size_pretty(pg_total_relation_size(CAST(tablename as text))) as size
from pg_tables
where tableName not like ‘sql_%’ and pg_size_pretty(pg_total_relation_size(CAST(tablename as text))) like ‘%MB%’;
Определение размеров таблиц в базе данных PostgreSQL
Код SQL SELECT tableName, pg_size_pretty(pg_total_relation_size(CAST(tablename as text))) as size
from pg_tables
where tableName not like ‘sql_%’
order by size;
Пользователи блокирующие конкретную таблицу
Код SQL select a.usename, t.relname, a.current_query, mode from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid inner join pg_stat_all_tables t on t.relid=l.relation where t.relname = ‘tablename’;
Код SQL select relation::regclass, mode, a.usename, granted, pid from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid where not mode = ‘AccessShareLock’ and relation is not null;
Запросы с эксклюзивными блокировками
Код SQL select a.usename, a.current_query, mode from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid where mode ilike ‘%exclusive%’;
Количество блокировок по пользователям
Код SQL select a.usename, count(l.pid) from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid where not(mode = ‘AccessShareLock’) group by a.usename;
Количество подключений по пользователям
Код SQL select count(usename), usename from pg_stat_activity group by usename order by count(usename) desc;
Категория:
Администрирование PostgreSQL: установка, настройка, обслуживание PostgreSQL напрямую "из коробки" применяться для использования с 1С Предприятем не может. Необходима именно адаптированная версия от 1С, превращающая PostgreSQL в блокировочник, причем нужно понимать, что блокировки будут накладываться на всю таблицу сразу. Если нужны блокировки на уровне записей, включаем в 1С режим управляемых блокировок и прописываем их в конфигурации ручками. Вывод: необходимо скачать специальный дистрибутив с сайта 1С или взять на диске ИТС.
Установка
Сама установка особых затруднений не вызывает, обратить внимание нужно на правильную инициализацию базы данных, а именно настройку локали, изменить потом это можно только повторной начальной инициализацией. Например, база 1С с украинскими региональными установками в СУБД с установленной русской локалью не загрузится. Да и проблемы с сортировкой потом не нужны. Поэтому делаем init в соответствии с нужным языком.
Для русского языка
initdb --locale=ru_RU.UTF-8 --lc-collate=ru_RU.UTF-8 --lc-ctype=ru_RU.UTF-8 --encoding=UTF8 -D /db/postgresql
Для украинского языка
initdb --locale=uk_UA.UTF-8 --lc-collate=uk_UA.UTF-8 --lc-ctype=uk_UA.UTF-8 --encoding=UTF8 -D /db/postgresql
где /db/postgresql ваш каталог данных PostgreSQL. Кодировка, конечно же, UTF-8.
Подробный вариант пересоздания кластера
1.Необходимо выдать полные права на папку в которую мы установили PostgreSQL, обычно это C:\Program Files\PostgreSQL
2.Из под админских прав запускаем cmd. Если это делаете в win7, то запускаем от Администратора.
3.Создаем папку где будет храниться кластер. Например d:\postgredata.
md d:\postgredata
4.Проводим инициализацию кластера вручную с указанием пути где он будет находиться.
“C:\Program Files\PostgreSQL\9.1.2-1.1C\bin\initdb.exe” -D d:\postgredata --locale=Russian_Russia --encoding=UTF8 -U postgres
5.Удаляем службу PostgreSQL, которая была установлена в ходе установки.
sc delete pgsql-9.1.2-1.1C-x64
Где pgsql-9.1.2-1.1C-x64 – Это название службы. Если не знаете название точно, можно посмотреть свойствах службы “PostgreSQL Database Server…” (Пуск – Панель управления – Администрирование – Службы )
6.Создаем новый сервис с указанием нашего кластера
“C:\Program Files\PostgreSQL\9.1.2-1.1C\bin\pg_ctl” register -N pgsql -U postgresql -P пароль -D d:/postgredata
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. Создадим правило через стандартный интерфейс, либо с помощью команды:
netsh advfirewall firewall add rule name="1Cv8-Server" dir=in action=allow protocol=TCP localport=1540,1541,5432,1560-1590 enable=yes profile=ANY remoteip=ANY interfacetype=LAN
Теперь с другого компьютера мы спокойно запускаем клиент 1С:Предприятия, добавляем существующую информационную базу newdb. Не забываем про лицензии, программной / аппаратной защиты.
Резервное копирование
Создание дампа базы данных делаем командой
su postgres -c 'pg_dump -U postgres -Fc -Z9 -f baza1.sql baza1'
Восстановление из дампа
su postgres -c 'pg_restore -U postgres -c -d baza1 -v baza1.sql'
Периодическое обслуживание
Рекомендуется настроить AVTO VACUUM в файле конфигурации. Но не пренебрегаем и запуском через планировщик принудительной команды.
su postgres -c '/usr/bin/vacuumdb --dbname=$i --analyze --full --quiet'
Просмотр активности PostgreSQL
Иногда полезно видеть чем сейчас занимается сервер. Поможет такая конструкция:
watch -n 1 'ps auxww | grep ^postgres'
Категория:
Администрирование Блокировка записей, невозможно изменить или удалить из регистра. Конфликт блокировок MS SQL + 1C При попытке удалить запись из регистра сведений - получаю ошибку: она заблокирована, ошибка блокировок и т.д.
Отключил всех пользователей, перезапустил сервер, пробую удалить - опять ошибка блокировки
Путем тестов было вяснено, что проблема не в коде, а происходит это на этапе обращения платформы к SQL серверу... после долгих поисков решений, в интернете была найдена статья, которая помогла в решении данной проблемы:
Кто что блокирует, MS SQL + 1C
В повседневной работе достаточно задействовать только первый блок "/*кто кого*/". Открываем MS SQL Server Management Studio, правой на корень - "new query" - вставляем код запроса (только верхнюю часть до "Кто что блокирует", остальное - для детального анализа), выполняем запрос (вверху есть кнопочка выполнения запроса).
Выполнив запрос, запоминаем "ID виновника", быстренько идем в консоль сервера 1С, заходим в ветку "Сеансы" нашей базы. Видим все соединения с 1С-сервером, ищем там колонку "Соединение с СУБД", чтобы увидеть соединения 1С-сервера с MSSQL-сервером. В колонке будет всего несколько заполненных значений, среди них и будет "ID виновника".
Что делать если его там нет, тут 3 варианта:
1. Вернитесь в MSSQL и сделайте запрос еще несколько раз подряд, если значения меняются или таблица вообще пуста - постоянной блокировки нет, у вас (уже) все в порядке.
2. Сеанс который блокирует MSSQL находится в другой базе т.е. блокировка не в той базе (можно попробовать задействовать ветку всех сеансов в консоли 1С-сервера) - вернитесь в MSSQL и внимательно посмотрите в колонку DB в ней находится название базы.
3. Бывает что ID процесса в 1С-консоли вообще отсутствует, такое тоже бывает если у вас есть какие-то внешние программы подключенные напрямую в базу 1С, если пускаете кого-то в MSSQL напрямую, то вариант не исключен.
Код SQL-запроса:
Код SQL SET TRANSACTION ISOLATION LEVEL READ UNCOMMIT TED
DECLARE @dbid AS smallint;
use [ВАШАБАЗА];
SET @dbid=DB_ID();
/*кто кого*/
SELECT DB_NAME(pr1.dbid) AS 'DB'
,pr1.spid AS 'ID жертвы'
,RTRIM(pr1.loginame) AS 'Login жертвы'
,pr2.spid AS 'ID виновника'
,RTRIM(pr2.loginame) AS 'Login виновника'
,pr1.program_name AS 'программа жертвы'
,pr2.program_name AS 'программа виновника'
,txt.[text] AS 'Запрос виновника'
FROM MASTER.dbo.sysprocesses pr1(NOLOCK)
JOIN MASTER.dbo.sysprocesses pr2(NOLOCK)
ON (pr2.spid = pr1.blocked)
OUTER APPLY sys.[dm_exec_sql_text](pr2.[sql_handle]) AS txt
WHERE pr1.blocked <> 0
/* Кто что блокирует */
SELECT s.[nt_username]
,request_session_id
,tran_locks.[request_status]
,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')' [Object]
,txt_blocked.[text]
,COUNT(*) [COUNT]
FROM sys.dm_tran_locks AS tran_locks WITH (NOLOCK)
JOIN sys.sysprocesses AS s WITH (NOLOCK)
ON tran_locks.request_session_id = s.[spid]
JOIN (
SELECT 'KEY' AS sResource_type
,p.[hobt_id] AS [id]
,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description]
FROM sys.partitions p
JOIN sys.objects o
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
UNION ALL
SELECT 'RID' AS sResource_type
,p.[hobt_id] AS [id]
,QUOTENAME(o.name) + '.' + QUOTENAME(i.name) AS [Description]
FROM sys.partitions p
JOIN sys.objects o
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
UNION ALL
SELECT 'PAGE'
,p.[hobt_id]
,QUOTENAME(o.name) + '.' + QUOTENAME(i.name)
FROM sys.partitions p
JOIN sys.objects o
ON p.object_id = o.object_id
JOIN sys.indexes i
ON p.object_id = i.object_id
AND p.index_id = i.index_id
UNION ALL
SELECT 'OBJECT'
,o.[object_id]
,QUOTENAME(o.name)
FROM sys.objects o
) AS RD
ON RD.[sResource_type] = tran_locks.resource_type
AND RD.[id] = tran_locks.resource_associated_entity_id
OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt_Blocked
WHERE (
tran_locks.request_mode = 'X'
AND tran_locks.resource_type = 'OBJECT'
)
OR tran_locks.[request_status] = 'WAIT'
GROUP BY
s.[nt_username]
,request_session_id
,tran_locks.[request_status]
,rd.[Description] + ' (' + tran_locks.resource_type + ' ' + tran_locks.request_mode + ')'
,txt_blocked.[text]
ORDER BY
6 DESC
IF EXISTS ( SELECT Name
FROM tempdb..sysobjects
WHERE name LIKE '#LOCK_01_01%' )
DROP TABLE #LOCK_01_01
CREATE TABLE #LOCK_01_01
(
spid INT,
dbid INT,
ObjId INT,
IndId SMALLINT,
Type VARCHAR(20),
Resource VARCHAR(50),
Mode VARCHAR(20),
Status VARCHAR(20)
)
INSERT INTO #LOCK_01_01
EXEC sp_lock
select OBJECT_NAME(ObjId) as [Имя объекта], Mode [Тип блокировки (код)],
CASE
WHEN Mode='Sch-S' THEN 'Блокировка стабильности схемы. Гарантирует, что элемент схемы, такой как таблица или индекс, не будет удален до тех пор, пока сеанс связи удерживает блокировку стабильности схемы на данный элемент схемы;'
WHEN Mode='Sch-М' THEN '= Блокировка изменения схемы. Должен поддерживаться любым сеансом связи, во время которого предполагается изменить схему данного ресурса. Гарантирует, что другие сеансы не имеют ссылок на обозначенный объект;'
WHEN Mode='S' THEN 'S = Коллективная блокировка. Удерживающему сеансу предоставлен коллективный доступ к ресурсу;'
WHEN Mode='U' THEN 'U = Блокировка обновления. Указывает блокировку обновления, полученную на ресурсы, которые со временем могут быть обновлены. Используется для предотвращения общей формы взаимоблокировки, которая возникает, когда множество сеансов блокируют ресурсы для потенциального обновления в последующее время;'
WHEN Mode='X' THEN 'X = Монопольная блокировка. Удерживающему сеансу предоставлен исключительный доступ к ресурсу;'
WHEN Mode='IS' THEN 'IS = Блокировка с намерением коллективного доступа. Указывает намерение поместить S блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='IU' THEN 'IU = Блокировка с намерением обновления. Указывает намерение поместить U блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='IX' THEN 'IX = Блокировка с намерением монопольного доступа. Указывает намерение поместить X блокировки на некоторые подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='SIU' THEN 'SIU = Коллективная блокировка с намерением обновления. Указывает коллективный доступ к ресурсу с намерением получения блокировок обновления на подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='SIX' THEN 'SIX = Коллективная блокировка с намерением монопольного доступа. Указывает коллективный доступ к ресурсу с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='UIX' THEN 'UIX = Блокировка обновления с намерением монопольного доступа. Указывает блокировку обновления ресурса с намерением получения монопольных блокировок на подчиненные ресурсы в иерархии блокировок;'
WHEN Mode='BU' THEN 'BU = Блокировка массового обновления. Используется для массовых операций;'
--[ ELSE else_result_expression ]
END as [Тип блокировки]
,syspr.spid, syspr.dbid, syspr.open_tran, syspr.status, syspr.hostprocess, syspr.loginame, syspr.hostname
From
#LOCK_01_01
inner join master.dbo.sysprocesses as syspr
on syspr.spid = #LOCK_01_01.spid and syspr.dbid = #LOCK_01_01.dbid
where
#LOCK_01_01.Type = 'TAB'
and
#LOCK_01_01.dbid = @dbid
/* Чем занят сервер*/
SELECT s.[spid]
,s.[loginame]
,s.[open_tran]
,s.[blocked]
,s.[waittime]
,s.[cpu]
,s.[physical_io]
,s.[memusage]
INTO #sysprocesses
FROM sys.[sysprocesses] s
WAITFOR DELAY '00:00:01'
SELECT txt.[text]
,s.[spid]
,s.[loginame]
,s.[hostname]
,DB_NAME(s.[dbid]) [db_name]
,SUM(s.[waittime] -ts.[waittime]) [waittime]
,SUM(s.[cpu] -ts.[cpu]) [cpu]
,SUM(s.[physical_io] -ts.[physical_io]) [physical_io]
,s.[program_name]
FROM sys.[sysprocesses] s
JOIN #sysprocesses ts
ON s.[spid] = ts.[spid]
AND s.[loginame] = ts.[loginame]
OUTER APPLY sys.[dm_exec_sql_text](s.[sql_handle]) AS txt
WHERE s.[cpu] -ts.[cpu]
+ s.[physical_io] -ts.[physical_io]
> 500
OR (s.[waittime] -ts.[waittime]) > 3000
GROUP BY
txt.[text]
,s.[spid]
,s.[loginame]
,s.[hostname]
,DB_NAME(s.[dbid])
,s.[program_name]
ORDER BY
[physical_io] DESC
DROP TABLE #sysprocesses
Категория:
Администрирование Настройка многопользовательских сетевых ключей 1С Речь ниже пойдет о usb-ключах, а программные лицензии > Если необходимо активировать многопользовательскую клиентскую лицензию 1С , так чтобы лицензии раздавал сервер приложений 1С, то это необходимо делать где угодно, только не на самом сервере приложений 1С. При этом в окне активации выбирать опцию «Дополнительно», поставить птичку на сервер 1С и указать параметры подключения к серверу.
о usb-ключах Как показал опыт, чтобы клиенты 1С могли нормально получить лицензию с сервера, необходимо выполнить ряд условий:
1. Раздача лицензий сервером приложений 1С:- Тут все просто, ставим сервер приложений 1С, втыкаем ключ и в свойствах зарегистрированной в кластере 1С базы выставляем параметр «Разрешить выдачу лицензий сервером 1С:Предприятия» в позицию «Да». При такой конфигурации раздавать пользовательские лицензии будет сам сервер приложений 1С, но есть один неприятный момент, каждая открытая копия 1С на пользовательском компьютере будет съедать по одной лицензии, т. е. если открыть с одного компа 10 раз одну и ту же базу, то будет съедено 10 лицензий!
2. Раздача лицензий Hasp License Manager: - Ставим Hasp License Manager в качестве сервиса и запускаем. - Как правило при установке он сам добавляет разрешающие правила во встроенный в винду брандмауэр, если этого не произошло, то добавляем вручную правило разрешающее подключения по протоколам TCP и UDP на порт 475. - Если сеть побита на VLAN-ы и используются различные ACL, то необходимо прописать везде где это нужно правила доступа, как в пункте выше. - Настраиваем файл конфигурации Hasp License Manager, который называется nhsrv.ini и лежит по умолчанию в C:\Program Files (x86)\Aladdin\HASP LM . Вот примерный конфиг, указываю только интересующие пункты, остальное у меня закоментировано:NHS_USERLIST = 250 ; максимальное количество обслуживаемых клиентов, по умолчанию 250 NHS_SERVERNAMES = ; имя сервера на котором установлен ключ с лицензиями и запущен Hasp LM NHS_USE_UDP = disabled ; включить или выключить использование протокола UDP, по умолчанию включен NHS_USE_TCP = enabled ; включить или выключить использование протокола TCP NHS_IP_portnum = 475 ; номер порта на котором принимает запросы Hasp LM NHS_IP_LIMIT = ; номера подсетей с которых разрешено подключение к Hasp LM NHS_USE_IPX = disabled ; включить или выключить использование IPX NHS_USE_NETBIOS = disabled ; включить или выключить использование NETBIOS - Настраиваем файл nethasp.ini на пользовательских компьютерах, по умолчанию лежит вC:\Program Files (x86)\1cv82\conf . Вот примерный конфиг, указываю только интересующие пункты, остальное у меня удалено:[NH_COMMON] NH_IPX = Disabled NH_NETBIOS = Disabled NH_TCPIP = Enabled
[NH_IPX]
[NH_NETBIOS]
[NH_TCPIP]
NH_SERVER_ADDR = 192.168.0.1, 192.168.0.2, 192.168.0.3 ; указываем где искать свободные лицензии, т. е. сервера на которых установлены многопользовательские клиентские ключи и настроенный Hasp LM NH_TCPIP_METHOD= TCP NH_SESSION = 5 NH_SEND_RCV = 4 NH_USE_BROADCAST = Disabled ; выключаем широковещание
- Стоит заметить, что когда раздача ключей настроена через Hasp LM, то пользователь занимает только одну лицензию, независимо от того сколько баз 1С он открыл, т. е. такой способ более выгоден экономически, но сложнее в реализации, особенно в больших организациях, где могут быть несколько сотен пользователей 1С.
- Если ключей много и доступ пользователей к ним делится по какому-то признаку (например по разным проектам), то хорошей практикой будет вести точный учет того, какие пользователи к каким ключам имеют доступ и настраивать их файлы nethasp.ini соотвественно. Это позволит администратору системы более полно владеть информацией и может очень помочь в решении проблем с нехваткой лицензий.
Источник
Категория:
JSON, XML, TXT, CSV, DBF Загрузка данных в 1С из PDF В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла...
И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.
Чтение PDF файлов из 1С
Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой В результате банальный текст вида Красный стул превращался в страшную кракозябру.
Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt
Поддержка командной строки:
PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]
<input PDF file> : Open an existing PDF file to convert.
[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.
[-first <page number>]: Specify the first page number.
[-last <page number>]: Specify the last page number.
[-logfile] : Write log to "C:\pdf2txt.log" file.
[-open] : Auto open the text file after it be created.
[-space] : Auto insert spaces into text file.
[-html] : Output to a HTML file, not a text file.
[-format] : Keep the page layout in the generated TXT file.
[-silent] : Disable error and warning messages.
[-blankline] : Auto delete blank line in the generated TXT file.
[-summary] : Get PDF document summary.
[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.
[-unicode] : Create UTF-8 encoding text file.
Примеры:
Код Batch File (DOS, CMD, BAT) C:\>PDF2TXT C:\input.pdf
C:\>PDF2TXT C:\input.pdf -unicode
C:\>PDF2TXT C:\input.pdf -first 10 -last 12
C:\>PDF2TXT C:\input.pdf C:\output.txt
C:\>PDF2TXT C:\input.pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input.pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt
В архиве (Скачать Вы можете из статьи по ссылке ) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо
Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С !
Код на 1С для конфигурации УТ 10.3:
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
ТекЗнч = СокрЛП(Лев(Стр,Поз-1));
Если ЗначениеЗаполнено(ТекЗнч) Тогда
МассивСтрок.Добавить(ТекЗнч);
КонецЕсли;
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
//Ищем Файлы
тч.Очистить();
НайденныеФайлы = НайтиФайлы(ПутьКPDF,"*.pdf",ложь);
Для каждого стр Из НайденныеФайлы Цикл
Нстр = ТЧ.Добавить();
Нстр.ФайлPDF = стр.Имя;
КонецЦикла;
ЭтаФорма.Обновить();
//Преобразуем PDF в TXT
Для каждого стр Из ТЧ Цикл
Попытка
pdf = СокрЛП(ПутьКPDF+"\"+стр.ФайлPDF);
txt = СтрЗаменить(pdf,"pdf","txt");
Команд = ПутьКPDF2TXT+"\pdf2txt.exe "+pdf+" "+txt;
ЗапуститьПриложение(Команд,ПутьКPDF,Истина);
стр.ФайлTXT = txt;
Исключение
стр.ФайлTXT = "!!!_ОШИБКА";
КонецПопытки;
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
КонецЦикла;
мТекущийПользователь = глЗначениеПеременной("глТекущийПользователь");
мСкладПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойСклад");
мОсновноеПодразделение = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеПодразделение");
мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов");
мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам");
мВидНоменклатурыПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойВидНоменклатуры");
мОтражатьВРеглУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете");
мОтражатьВБухУчета = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете");
мОтражатьВНалУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете");
//Создаем Документ
Для каждого стр Из ТЧ Цикл
Состояние("Загружаю: "+стр.ФайлTXT);
текдок=Новый ТекстовыйДокумент;
текдок.Прочитать(стр.ФайлTXT,"UTF-8");
ЗагрузкаТЧ=Ложь;
ДокВозвратТоваровОтПокупателя = Документы.ВозвратТоваровОтПокупателя.СоздатьДокумент();
ДокВозвратТоваровОтПокупателя.Ответственный = мТекущийПользователь;
ДокВозвратТоваровОтПокупателя.Дата = ОбщегоНазначения.ПолучитьРабочуюДату();
ДокВозвратТоваровОтПокупателя.УстановитьНовыйНомер();
ДокВозвратТоваровОтПокупателя.ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад;
ДокВозвратТоваровОтПокупателя.СкладОрдер = Склад;
ДокВозвратТоваровОтПокупателя.Подразделение = мОсновноеПодразделение;
ДокВозвратТоваровОтПокупателя.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
ДокВозвратТоваровОтПокупателя.УчитыватьНДС = ИСТИНА;
ДокВозвратТоваровОтПокупателя.СуммаВключаетНДС = ИСТИНА;
Для Ном=1 по текдок.КоличествоСтрок() цикл
ТСтр = текдок.ПолучитьСтроку(Ном);
ТекСтр = СокрЛП(ТСтр);
Если Найти(ТекСтр, "Всего по накладной")>0 Тогда
ЗагрузкаТЧ=Ложь;
//делаем пересчеты сумм, количества мест и НДС по строкам
Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя.Товары Цикл
ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
КонецЦикла;
Попытка
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
стр.Документ = ДокВозвратТоваровОтПокупателя.Ссылка;
стр.Инфо = "Все ОК";
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
//ВСЕ
Прервать;
КонецЕсли;
Если ЗагрузкаТЧ Тогда
ТекСтр = СтрЗаменить(ТекСтр, "подложке ","подложке");
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>2 Тогда
//Сообщить(СтрМ);
Попытка
НоваяСтрока = ДокВозвратТоваровОтПокупателя.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СтрМ[2]);
//НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицы.ХарактеристикаНоменклатуры;
//УстановитьСтавкуНДСВТабЧасти(НоваяСтрока, СтрокаТаблицы);
//ПроверитьНаличиеСерииНоменклатуры(НоваяСтрока, СтрокаТаблицы);
//УстановитьПризнакВеденияПоСериямНоменклатуры(НоваяСтрока);
НоваяСтрока.ЕдиницаИзмерения = НоваяСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
НоваяСтрока.Коэффициент = 1;
НоваяСтрока.Количество = Число(СтрМ[6]);
НоваяСтрока.Цена = Число(СтрМ[7]);
НоваяСтрока.Сумма = Число(СтрМ[8]);
НоваяСтрока.СуммаНДС = Число(СтрМ[11]);
НоваяСтрока.Качество = Справочники.Качество.Новый;
Попытка
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС["НДС"+Лев(СокрЛП(СтрМ[9]),2)];
Исключение
НоваяСтрока.СтавкаНДС = НоваяСтрока.Номенклатура.СтавкаНДС;
КонецПопытки;
Исключение
Сообщить("Не загружено: "+ТекСтр);
КонецПопытки;
Иначе
Продолжить;
КонецЕсли;
Иначе
// Возможно что-то будет
КонецЕсли;
//Сообщить(ТекСтр);
Если Найти(ТекСтр, "Товарная накладная")>0 Тогда
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>1 Тогда
//Сообщить(СтрМ);
ДокВозвратТоваровОтПокупателя.НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1];
ТекДата = СтрМ[2];
ДокВозвратТоваровОтПокупателя.ДатаВходящегоДокументаЭлектронногоОбмена = Дата(Прав(ТекДата,4)+Сред(ТекДата,4,2)+Лев(ТекДата,2));
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Грузополучатель:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекОрганизация = Справочники.Организации.НайтиПоРеквизиту("ИНН",текИНН);
Если ТекОрганизация=Справочники.Организации.ПустаяСсылка() Тогда
ДокВозвратТоваровОтПокупателя.Организация = Организация;
Иначе
ДокВозвратТоваровОтПокупателя.Организация = ТекОрганизация;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Поставщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПоставщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
ДокВозвратТоваровОтПокупателя.Контрагент = ТекПоставщик;
ДокВозвратТоваровОтПокупателя.ДоговорКонтрагента = ТекПоставщик.ОсновнойДоговорКонтрагента;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Плательщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПлательщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
КонецЕсли;
КонецЕсли;
Если текстр="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" Тогда
ЗагрузкаТЧ=Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПутьКPDF2TXTОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF2TXT = ДиалогОткрытия.Каталог;
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Категория:
Загрузка данных в 1С Как получить результат запроса в web таблицу используя Web сервис? Медитируя на тему почему нет нормальной “Консоли запросов в управляемом приложении” захотелось покопаться в этих внутренностях 1С.
Как ставить и настраивать вэб-сервис в 1С, я не буду расказывать. Вы это легко найдете.
Идея такая: почему бы нам не создать вэб-сервис, который на строку запроса 1С выдаст web таблицу(с тэгами…). Заморачиваться с XTDO не советую, капризный он. Выдаем ответ сервера в виде строки. Данные в таблице для простоты тоже сделаем текстовыми (html).
Сделаем конфигурацию в которой один вэб-сервис (Прикреплен к статье). И распишем функцию подробно,чтобы ее можно было подключить к любой конфигурации вручную.
Все парамеры в функции строковые
Request1C – текст запроса
TableData – html строка ответа.
Возвращаем истина или ложь;
Код 1C v 8.2 УП //Возврат результата запроса в web table
Функция Request1CWebTable(Request1C, ТableData)
Запрос = Новый Запрос;
ТableData = “”;
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ТекстЗапроса = Сериализатор.ПрочитатьXDTO(Request1C);
Запрос.Текст = ТекстЗапроса;
//Результат – таблица значений
Попытка
ТабЗапроса = Запрос.Выполнить().Выгрузить();
Исключение
ЗаписьЖурналаРегистрации(“Request1C”,,,,Строка(Request1C) + ” !!! “+ОписаниеОшибки());
Возврат Ложь;
Конецпопытки;
//строка заголовка
ТableData = ““;
Для каждого колонка Из ТабЗапроса.Колонки Цикл
ТableData = ТableData + “”+ СокрЛП(колонка.Заголовок) + “”;
КонецЦикла;
ТableData = ТableData + “”;
//таблица данных
ТableData = ТableData + “”;
Для строка=0 По ТабЗапроса.Количество()-1 Цикл
ТableData = ТableData + “”;
Для кол=0 По ТабЗапроса.колонки.Количество()-1 Цикл
ТableData = ТableData + “”+ Строка(ТабЗапроса[строка][кол]) + “”;
КонецЦикла;
ТableData = ТableData + “”;
КонецЦикла;
ТableData = ТableData + “”;
ТабЗапроса = 0;
Возврат Истина;
КонецФункции
Публикуем web-сервис c именем
testws . Для тестирования уберем из базы всех пользователей, включаем анонимную идентификацию и смотрим чтобы ресурс
htp://localhost/testws/ws/testws?wsdl был доступен из браузера. Если показывает в браузере описание вэб-сервиса, значит все нормально.
Это все хорошо, но как все это показать? Сделаем страницу входа для обработки в вашем любимом Web-сервере. Или просто бросьте папку test1C в папку C:\inetpub\wwwroot для MS IIS(Internet Information Server)
Вы не разбираетесь в Web программировании – не беда. Главное усвоить основы. Мы посылаем специально подготовленный post запрос в Web-сервер, он передает его 1С и возращает ответ. И нам в браузере необходимо обработать ответ сервера.
Запрос:
Код var soapEnv = ‘ ‘; soapEnv += ”;
soapEnv += $(‘#textRequest’).val(); soapEnv += ”;
#textRequest – поле нашего запроса.
Вырезаем из ответа сервера необходимое и преобразуем назад спец символы < и > на < и >.
Код var strBegin = “< ; table id=’result_table’”;
var strEnd = “</m:TableData>”;
dataResponce = dataResponce.substring(dataResponce.indexOf(strBegin), dataResponce.indexOf(strEnd));
$(‘#result’).html(htmlspecialchars_decode(dataResponce));
Спасибо авторам библиотек jquery.com и tablesorter.com и их лицензиям(GPL,
MIT ) за их открытость. С помощью jquery не надо писать разный код под разные браузеры(они к сожалению различаются). А tablesorter используем для просоты вывода…
Заходим в браузер http://localhost/test1C и пишем запрос… Правильно написать запрос у меня не получается, я всегда копирую его из консоли запросов.
Нажимаем кнопку. И приходит к нам счастье.
Дополнительно скажу, что для слишком больших результатов запросов данная схема может не работать. У меня где-то начинала не выводить или выводить неправильно к 10000-100000 записям. Скорее всего ответ сервера посто не залезает в один пакет soap. А если отключить сжатие пакетов я думаю будет еще хуже. Так, что будьте осторожны.
Скачать обработку :
Скачивать файлы может только зарегистрированный пользователь!
P.S.
Ну очень грубо говоря так и работает 1С тонкий и web-клиент
Автор:
sikuda Категория:
WEB-сервисы, WS-ссылки, XDTO-пакеты Загрузка данных из текстовых файлов, выбирая SQL запросом данные из этих файлов Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Рассмотрим вариант как это сделать! Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt
Код Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов. Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл
schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х // Загружает данные из текстовых данных
//
// Параметры
// Стр_КаталогДанных - <Строка>
//
// Автор: Gmix 04.05.2006 12:22:09
//
// Возвращаемое значение:
// <Булево>
//
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
// проверки заполнения
ОБ_ФайлДанных=Новый Файл(Стр_КаталогДанных);
Если НЕ ОБ_ФайлДанных.ЭтоКаталог() Тогда
Сообщить("Необходимо указать каталог данных!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
Если НЕ ОБ_ФайлДанных.Существует() Тогда
Сообщить("Каталог """+Стр_КаталогДанных+""" не существует!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
ОБ_АДОКонект = Новый COMОбъект("ADODB.Connection");
ОБ_АДОРекордсетШапка = Новый COMОбъект("ADODB.Recordset");
ОБ_АДОРекордсетСтроки = Новый COMОбъект("ADODB.Recordset");
//Определяем пару файлов
Стр_ОкончаниеФайла="";
ФайлыШапок = НайтиФайлы(Стр_КаталогДанных, "Head_*.txt");
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла=Сред(ФайлШапки.ИмяБезРасширения,6);
Стр_таблицаШапки=ФайлШапки.Имя;
Стр_ТаблицаСтрок="Rows_"+Стр_ОкончаниеФайла+".txt";
Стр_ИмяФайлСтрок=ДобавлениеСлеша(Стр_КаталогДанных)+Стр_ТаблицаСтрок;
ФайлСтрок=Новый Файл(Стр_ИмяФайлСтрок);
Если НЕ ФайлСтрок.Существует() Тогда
Сообщить("Не найден файл строк для файла шапки """+Стр_таблицаШапки+"""! Пара файлов не обработана",СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
//Создаем схему данных
ФайлСхемыДанных=Новый Файл(ДобавлениеСлеша(Стр_КаталогДанных)+"schema.ini");
Если ФайлСхемыДанных.Существует() Тогда
Попытка
УдалитьФайлы(ФайлСхемыДанных.Путь,ФайлСхемыДанных.Имя);
Исключение
Сообщить("Не возможно удалить файл """+ФайлСхемыДанных.ПолноеИмя+""" для создания новой схемы данных! Проверте атрибуты файла",СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Стр_СхемаДанныхТхт="["+Стр_таблицаШапки+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|["+Стр_ТаблицаСтрок+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9";
ТекстСхемы=Новый ЗаписьТекста(ФайлСхемыДанных.ПолноеИмя, КодировкаТекста.ANSI);
ТекстСхемы.Записать(Стр_СхемаДанныхТхт);
ТекстСхемы.Закрыть();
// Создаем коннект
Попытка
ОБ_АДОКонект.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Стр_КаталогДанных+";Extended Properties='text;FMT=Delimit ed;HDR=NO'");
Исключение
Сообщить("Невозможно открыть соединение!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Стр_SQL = "S_elect * FROM "+Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ ОБ_АДОРекордсетШапка.EOF Цикл
// Заказ
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка.Fields("NumberNote").Value;
Стр_КодКА= ОБ_АДОРекордсетШапка.Fields("StoreNum").Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка.Fields("DataNote").Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка.Fields("DataDev").Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка.Fields("DataDes").Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка.Fields("CountLine").Value;
Сообщить("Заказ № "+Стр_НомерЗаказа+" от " +Д_ДатаЗаказа+ " Код контрагента: "+Стр_КодКА+" Дата доставки: "+Д_ДатаДоставки);
// Обработка строк заказа
Стр_SQL = "S_elect * FROM "+Стр_ТаблицаСтрок+" WHERE NumberNote='"+Стр_НомерЗаказа+"'";
Попытка
ОБ_АДОРекордсетСтроки=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Сч=0;
Сообщить(" № Артикул Количество");
Пока НЕ ОБ_АДОРекордсетСтроки.EOF Цикл
//Заполняем таб часть документа
Сч=Сч+1;
Стр_Артикул=СокрЛП(ОБ_АДОРекордсетСтроки.Fields("Articul").Value);
Ч_Количество=ОБ_АДОРекордсетСтроки.Fields("Counts").Value;
Сообщить(""+Сч+" " +Стр_Артикул+ " "+Ч_Количество);
ОБ_АДОРекордсетСтроки.MoveNext();
КонецЦикла;
ОБ_АДОРекордсетШапка.MoveNext();
КонецЦикла;
КонецЦикла;
Возврат Истина;
КонецФункции // ЗагрузитьДанныеИзtxt() Gmix 04.05.2006 12:22:21
Автор:
Журавлев Михаил Викторович Категория:
Конвертация данных, Обмен, Перенос Обмен данными 1Сv8 Управление Торговлей 10.1 и virtuemart Задача: создать обмен 1с v8 управление торговлей 10.1 и virtuemart .
Что такое VM можно почитать тут www.virtuemart.ru, вкраце - это компонент интернет магазина/каталога товаров к известному CMS движку Joomla.
Код 1C v 8.х Процедура СнятиеФлагаПустыхГрупп(Кнопка)
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=хххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
RSIDProduct= Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
Сообщить (Строка (ТекущаяДата()) + " обновляем флаг пустых групп");
Запрос =Новый Запрос;
ЗАпрос.Текст ="ВЫБРАТЬ РАЗЛИЧНЫЕ
| Номенклатура.ЭтоГруппа,
| Номенклатура.НеОтображатьWeb,
| Номенклатура.НеОтображатьНикогда,
| Номенклатура.Код КАК Код,
| Номенклатура.Артикул,
| Номенклатура.ПустойОстаток
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ИСТИНА";
// | И (Номенклатура.ПустойОстаток = ИСТИНА
// | ИЛИ Номенклатура.НеОтображатьWeb = ИСТИНА
// | ИЛИ Номенклатура.НеОтображатьНикогда = ИСТИНА)";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.ПустойОстаток ИЛИ Выборка.НеОтображатьНикогда ИЛИ Выборка.НеОтображатьWEB Тогда
АпдейтГрупп = "UPD ATE jos_vm_category SET category_publish='N' WHERE category_description='"+Выборка.Код+"'" ;
Иначе
АпдейтГрупп = "UPD ATE jos_vm_category SET category_publish='Y' WHERE category_description='"+Выборка.Код+"'" ;
КонецЕсли;
Command.CommandText = АпдейтГрупп;
Command.CommandType = 1;
Попытка
РекордСет = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Процедура КнопкаВыполнитьНажатие(Кнопка)
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=ххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
RSIDProduct= Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
// выберем запросом все группы товаров
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.ПометкаУдаления,
| Номенклатура.Предопределенный,
| Номенклатура.Родитель,
| Номенклатура.ЭтоГруппа,
| Номенклатура.Код,
| Номенклатура.Наименование,
| Номенклатура.НеОтображатьWeb,
| Номенклатура.НеОтображатьНикогда,
| Номенклатура.Артикул,
| Номенклатура.ПустойОстаток
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ИСТИНА";
// | И Номенклатура.Родитель = &Родитель";
// Запрос.УстановитьПараметр("Родитель",Справочники.Номенклатура.ПустаяСсылка());
Результат = Запрос.Выполнить();
Выборка= Результат.Выбрать();
ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Выборка.Количество();
н=0;
Пока Выборка.Следующий() Цикл
н=н+1;
// запрос существования товара в базе виртуемарта
query = "
|SEL ECT category_id
|FR OM jos_vm_category WHERE category_description='"+Выборка.Код+"' limit 1";
RSIDProduct.CursorType = 3;
RSIDProduct.Open(query, Connection);
Если RSIDProduct.EOF() И RSIDProduct.BOF() Тогда
СтрН = СтрЗаменить(Строка(н)," ","");
//пишем группы верхнего уровня
// если группа имеет признак того что-бы ее не выгружать на web то отменим публикацию // необходимо для оптимизации добавить рекурсию по родительскому каталогу
Если Выборка.НеОтображатьWeb или Выборка.НеОтображатьНикогда или Выборка.Родитель.НеОтображатьНикогда или Выборка.Родитель.НеОтображатьWeb или Выборка.ПустойОстаток
Тогда
query = "ins ert into jos_vm_category (vendor_id , category_name ,category_description, category_publish , category_browsepage , products_per_row , category_flypage, list_order )
|values ('1' , '"+Выборка.НАИМЕНОВАНИЕ+"' ,'"+Выборка.Код+"', 'N', 'managed' , '1' , 'flypage.tpl', '1')";
// иначе публикуем
Иначе
query = "ins ert into jos_vm_category (
|vendor_id ,
|category_name ,
|category_description,
|category_publish ,
|category_browsepage ,
|products_per_row ,
|category_flypage,
|list_order )
|values ('1' , '"+Выборка.НАИМЕНОВАНИЕ+"' ,'"+Выборка.Код+"', 'Y', 'managed' , '1' , 'flypage.tpl', '1')";
КонецЕсли;
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
Сообщить (Выборка.Код);
Сообщить (Формат (н,"ЧГ=0"));
КонецПопытки;
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.Код+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИДГруппы = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
query = "ins ert into jos_vm_category_xref ( `category_parent_id` , `category_child_id` )
|values ( '"+0+"' , '"+Формат(ИДгруппы,"ЧГ=0")+"' )";
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (Выборка.Код);
Сообщить(ОписаниеОшибки());
КонецПопытки;
ОбработкаПрерыванияПользователя();
// Состояние("Обновляем группу товаров " + Выборка.Наименование);
КонецЕсли;
Индикатор1=н;
RSIDProduct.Close();
КонецЦикла;
Сообщить ("обновлено " + н+ " групп");
// обновим статус публикацию групп
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка,
| Номенклатура.ПометкаУдаления,
| Номенклатура.Предопределенный,
| Номенклатура.Родитель.Код КАК КодРодителя,
| Номенклатура.ЭтоГруппа,
| Номенклатура.Код,
| Номенклатура.Наименование,
| Номенклатура.НеОтображатьWeb,
| Номенклатура.НеОтображатьНикогда
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.ЭтоГруппа = ИСТИНА
| И (НЕ Номенклатура.Родитель = &Родитель)";
Запрос.УстановитьПараметр("Родитель",Справочники.Номенклатура.ПустаяСсылка());
Результат = Запрос.Выполнить();
Выборка= Результат.Выбрать();
ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Выборка.Количество();
н=0 ;
Сообщить ("Строим структуру...");
Пока Выборка.Следующий() Цикл
н=н+1;
// Если не Выборка.Ссылка.Уровень=0 тогда
//1 найдем айди родителя и категории в виртуамарте
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.КодРодителя+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИДРодителя = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.Код+"' limit 1";
RS.Open(query, Connection);
Попытка
RS.MoveFirst();
Исключение
Сообщить (Выборка.Код);
КонецПопытки;
Пока RS.EOF() = 0 Цикл
ИДГруппы = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
//найдем и завалим запись в категории
query = "delete fr om jos_vm_category_xref where category_child_id='"+Формат(ИДгруппы,"ЧГ=0")+"'";
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (Выборка.Код);
Сообщить(ОписаниеОшибки());
КонецПопытки;
// добавим запись в категорию
query = "ins ert into jos_vm_category_xref ( category_parent_id , category_child_id)
|values ( '"+Формат(ИДРодителя,"ЧГ=0")+"' , '"+Формат(ИДгруппы,"ЧГ=0")+"' )";
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (Выборка.Код);
Сообщить(ОписаниеОшибки());
КонецПопытки;
Индикатор1=н;
// КонецЕсли;
КонецЦикла;
Сообщить ("обновлена структура " + н+ " групп");
// RS.Close();
Connection.Close();
КонецПроцедуры
Процедура ОсновныеДействияФормыОчистьТАблицыSQL(Кнопка)
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=ххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
query ="
|DELETE FR OM jos_vm_category";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_category_xref";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_product";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_product_category_xref";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
query ="
|DELETE FR OM jos_vm_product_price";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
// RS.Close();
Connection.Close();
КонецПроцедуры
Процедура ОсновныеДействияФормыОбновитьТовары(Кнопка)
Сообщить (Строка (ТекущаяДата()) + " обновляем группы товаров...");
КнопкаВыполнитьНажатие(1);
СтрПодключения = "DSN=mySQL_ishop;";
СтрПодключения = СтрПодключения+"Database=joomla;";
СтрПодключения = СтрПодключения+"Uid=Sa;";
СтрПодключения = СтрПодключения+"Pwd=ххххххх;";
Connection = Новый COMОбъект("ADODB.Connection");
Connection.Open(СтрПодключения);
RS = Новый COMОбъект("ADODB.Recordset");
RSIDProduct = Новый COMОбъект("ADODB.Recordset");
Command = Новый COMОбъект ("ADODB.Command");
Command.ActiveConnection = Connection;
Склад = Константы.СкладРозница.Получить();
Сообщить (Строка (ТекущаяДата()) + " распубликовываем отсутсвующие товары");
Запрос = Новый Запрос;
Запрос.Текст ="ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Остаток,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Артикул КАК Артикул,
| ЕСТЬNULL(ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0), 0) КАК ДоступноеКоличество,
| ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) КАК Заказы
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&КонецДня, СкладКомпании = &Склад) КАК ОстаткиТоваровКомпанииОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки(&КонецДня, ) КАК ЗаказыПокупателейОстатки
| ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЗаказыПокупателейОстатки.Номенклатура
|ГДЕ
| ОстаткиТоваровКомпанииОстатки.Заказ = &ПустойЗаказ
| И ЕСТЬNULL(ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0), 0) > 0
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр = 0)
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр2 = 0)";
Запрос.УстановитьПараметр("ПустойЗаказ", Документы.ЗаказПокупателя.ПустаяСсылка());
Запрос.УстановитьПараметр("Склад",Склад );
Запрос.УстановитьПараметр("КонецДня",КонецДня (ТекущаяДата()));
// Запрос.УстановитьПараметр("Артикул",Артикул);
ТЗостатоков = Запрос.Выполнить().Выгрузить();
// ТЗостатоков.ВыбратьСтроку();
query = "
|SEL ECT product_sku, product_id
|FR OM jos_vm_product";
RS.Open(query, Connection);
Если (НЕ RS.EOF()) И (НЕ RS.BOF()) Тогда
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
Артикул = RS.Fields("product_sku").Value;
ПродуктИД = RS.Fields("product_id").Value;
// Если Выборка.Количество()= 0 Тогда
Если ТЗостатоков.Найти(Артикул,"Артикул")= Неопределено Тогда
АпдейтВиртмарта = "UPD ATE jos_vm_product SET product_in_stock= '0',product_publish='N' WHERE product_sku='"+Артикул+"'" ;
Command.CommandText = АпдейтВиртмарта;
Command.CommandType = 1;
Попытка
РекордСет = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
КонецЕсли;
RS.MoveNext();
КонецЦикла;
КонецЕсли;
RS.Close();
//** модуль обновление цен
Сообщить (Строка (ТекущаяДата()) + " начинаем обновление цен на сайте...");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток КАК Остаток,
| ОстаткиТоваровКомпанииОстатки.Номенклатура КАК Номенклатура,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Код КАК Код,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Артикул КАК Артикул,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Наименование КАК Наименование,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.Код КАК РодительКОД,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.Артикул КАК РодительАртикул,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр КАК WEbЦЕнаУПР,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр2 КАК WEbЦЕнаУПР2,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.НеВыводитьНаСайт КАК НеВыводитьНаСайт,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.НеОтображатьWeb КАК НеОтображатьWeb,
| ОстаткиТоваровКомпанииОстатки.Номенклатура.Родитель.НеОтображатьНикогда КАК НеОтображатьНикогда,
| ЕСТЬNULL(ЕСТЬNULL(ОстаткиТоваровКомпанииОстатки.КоличествоОстаток, 0) - ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0), 0) КАК ДоступноеКоличество,
| ЕСТЬNULL(ЗаказыПокупателейОстатки.КоличествоОстаток, 0) КАК Заказы
|ИЗ
| РегистрНакопления.ОстаткиТоваровКомпании.Остатки(&КонецДня, СкладКомпании = &Склад) КАК ОстаткиТоваровКомпанииОстатки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ЗаказыПокупателей.Остатки(&КонецДня, ) КАК ЗаказыПокупателейОстатки
| ПО ОстаткиТоваровКомпанииОстатки.Номенклатура = ЗаказыПокупателейОстатки.Номенклатура
|ГДЕ
| ОстаткиТоваровКомпанииОстатки.КоличествоОстаток > 0
| И ОстаткиТоваровКомпанииОстатки.Заказ = &ПустойЗаказ
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр = 0)
| И (НЕ ОстаткиТоваровКомпанииОстатки.Номенклатура.WebЦенаУпр2 = 0)";
Запрос.УстановитьПараметр("ПустойЗаказ", Документы.ЗаказПокупателя.ПустаяСсылка());
Запрос.УстановитьПараметр("Склад", Справочники.СкладыКомпании.НайтиПоКоду("00002"));
Запрос.УстановитьПараметр("КонецДня",КонецДня(ТекущаяДата()));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ЭлементыФормы.Индикатор1.МинимальноеЗначение = 0;
ЭлементыФормы.Индикатор1.МаксимальноеЗначение = Выборка.Количество();
н=0 ;
ЗапросКурса = Новый Запрос;
ЗапросКурса.Текст = "ВЫБРАТЬ
| КурсыВалютСрезПоследних.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&ТекущаяДата, ) КАК КурсыВалютСрезПоследних
|ГДЕ
| КурсыВалютСрезПоследних.Валюта = &Валюта";
ЗапросКурса.УстановитьПараметр("Валюта", Константы.ВалютаУправленческогоУчетаКомпании.Получить());
ЗапросКурса.УстановитьПараметр("ТекущаяДата",КонецДня(ТекущаяДата()));
ВыборкаКурса = ЗапросКурса.Выполнить().Выбрать();
Пока ВыборкаКурса.Следующий() Цикл
Курс = ВыборкаКурса.Курс;
КонецЦикла;
Пока Выборка.Следующий() Цикл
н=н+1;
// Если Выборка.ДоступноеКоличество < 0 Тогда ДОступноеКоличество=0; Иначе ДОступноеКоличество=Выборка.ДоступноеКоличество; КонецЕсли;
ДОступноеКоличество=Выборка.ДоступноеКоличество;
// Сообщить (Выборка.Номенклатура.Наименование + " " + ДОступноеКоличество);
флагсуществования=Ложь;
// убираем непорядочные символы
Наименование = СтрЗаменить(Выборка.Наименование,"'"," "); //уберем символ '
// запрос существования товара в базе виртуемарта
query = "
|SEL ECT *
|FR OM jos_vm_product WHERE product_sku='"+Выборка.Артикул+"' limit 1";
RSIDProduct.Open(query, Connection);
Если RSIDProduct.EOF() И RSIDProduct.BOF() Тогда
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьНикогда=Ложь; Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьWeb=Ложь Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
Если ПРО2 Тогда Цена = ВЫборка.WEbЦЕнаУПР2; Иначе Цена = Выборка.WEbЦЕнаУПР; КонецЕсли;
Если Выборка.НеВыводитьНаСайт Тогда
// флаги отображения на сайте
//Если Выборка.НеВыводитьНаСайт или Выборка.НеОтображатьНикогда или Выборка.НеОтображатьWeb Тогда
query = "ins ert into jos_vm_product ( vendor_id , product_parent_id , product_sku , product_s_desc , product_publish , product_special , product_discount_id , product_name , product_unit , quantity_options, product_order_levels, product_in_stock, product_sales,product_url )
|values ( '1', '0', '"+Выборка.Артикул+"', '"+наименование+"', 'N', 'N', '0', '"+наименование+"', 'шт.', 'none,0,0,1', '0,0','"+Формат (ДОступноеКоличество, "ЧГ=0")+"','"+Формат (Цена*Курс,"ЧГ=0")+"','http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"')";
Иначе
query = "ins ert into jos_vm_product ( vendor_id , product_parent_id , product_sku , product_s_desc , product_publish , product_special , product_discount_id , product_name , product_unit , quantity_options, product_order_levels, product_in_stock, product_sales, product_url )
|values ( '1', '0', '"+Выборка.Артикул+"', '"+наименование+"', 'Y', 'N', '0', '"+наименование+"', 'шт.', 'none,0,0,1', '0,0','"+Формат (ДОступноеКоличество, "ЧГ=0")+"','"+Формат (Цена*Курс,"ЧГ=0")+"','http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"')";
КонецЕсли;
// запишем номенклатуру
// Сообщить (query);
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
RSIDProduct.Close();
флагсуществования =Ложь;
Иначе
флагсуществования=Истина;
// выполним пока не нужный запрос /// данные об изменении в номенклатуре
//RSIDProduct.MoveFirst();
//Пока RSIDProduct.EOF() = 0 Цикл
// ИД = RSIDProduct.Fields("product_id").Value;
// RSIDProduct.MoveNext();
//КонецЦикла;
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьНикогда=Ложь; Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
// Если Выборка.НеОтображатьНикогда = NULL Тогда НеОтображатьWeb=Ложь Иначе НеОтображатьНикогда=ИСТИНА; КонецЕсли;
Если ПРО2 Тогда Цена = ВЫборка.WEbЦЕнаУПР2; Иначе Цена = Выборка.WEbЦЕнаУПР; КонецЕсли;
Если Выборка.НеВыводитьНаСайт Тогда
query = "UPD ATE jos_vm_product SET product_sku='"+Выборка.Артикул+"', product_s_desc= '"+наименование+"',product_in_stock= '"+Формат (ДОступноеКоличество, "ЧГ=0")+"',product_sales='"+Формат (Цена*Курс,"ЧГ=0")+"',product_url='http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"',product_publish='N' WHERE product_sku='"+Выборка.Артикул+"'" ;
Иначе
query = "UPD ATE jos_vm_product SET product_sku='"+Выборка.Артикул+"', product_s_desc= '"+наименование+"',product_in_stock= '"+Формат (ДОступноеКоличество, "ЧГ=0")+"',product_sales='"+Формат (Цена*Курс,"ЧГ=0")+"',product_url='http://catalog.sunrise.ru/descriptionPage.aspx?a="+Выборка.Артикул+"',product_publish='Y' WHERE product_sku='"+Выборка.Артикул+"'" ;
КонецЕсли;
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить (ОписаниеОшибки());
КонецПопытки;
RSIDProduct.Close();
КонецЕсли;
// Попытка записать Данные о товаре
Попытка
// запрос ID родителя товара
query = "
|SEL ECT *
|FR OM jos_vm_category WHERE category_description='"+Выборка.РодительКод+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИДгрупы = RS.Fields("category_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
//Обновление группы
// запрос айди товара в мускуле виртуемарта
// Сообщить (Выборка.Номенклатура.Артикул);
query = "
|SEL ECT *
|FR OM jos_vm_product WHERE product_sku='"+Выборка.Артикул+"' limit 1";
RS.Open(query, Connection);
RS.MoveFirst();
Пока RS.EOF() = 0 Цикл
ИД = RS.Fields("product_id").Value;
RS.MoveNext();
КонецЦикла;
RS.Close();
Если НЕ флагсуществования Тогда
query = "ins ert into jos_vm_product_category_xref (category_id , product_id ) values ( '"+Формат(ИДгрупы,"ЧГ=0")+"' , '"+Формат(ИД,"ЧГ=0")+"' )";
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
Иначе
query = "UPD ATE jos_vm_product_category_xref SET category_id='"+Формат(ИДгрупы,"ЧГ=0")+"' WHERE product_id='"+Формат(ИД,"ЧГ=0")+"'";
// "UPD ATE jos_vm_product_category_xref SET category_id='"+Формат(ИДгрупы,"ЧГ=0")+"', product_id='"+Формат(ИД,"ЧГ=0")+"' WHERE product_id='"+Формат(ИД,"ЧГ=0")+"' " ;
// Сообщить (query);
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
КонецЕсли;
// прибьем ценник товара
query = "delete fr om jos_vm_product_price WHERE product_id='"+Формат(ИД,"ЧГ=0")+"' " ;
Command.CommandText = query;
Command.CommandType = 1;
RS = Command.Execute();
// все поля важны !
query = "I_nsert into jos_vm_product_price (
|product_id,
|product_price,
|product_currency,
|product_price_vdate,
|product_price_edate,
|cdate,
|mdate,
|shopper_group_id,
|price_quantity_start,
|price_quantity_end )
|values ( '"+Формат(ИД,"ЧГ=0")+"' , '"+Формат (Цена*Курс,"ЧГ=0")+"','RUB',0,0,1222792314,1222792314,'5',0,0 )";
// Сообщить(Формат(ИД,"ЧГ=0"));
Command.CommandText = query;
Command.CommandType = 1;
Попытка
RS = Command.Execute();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Исключение
Сообщить (ОписаниеОшибки());
Сообщить (Выборка.Наименование);
КонецПопытки;
ОбработкаПрерыванияПользователя();
// Состояние("Обновляем товары " + Выборка.Номенклатура.Наименование);
Индикатор1 = н;
КонецЦикла;
Сообщить ("Выгружено " + н + " объектов");
Сообщить(Строка (ТекущаяДата()) + " обновление завершено");
КонецПроцедуры
Процедура Автомат ()
ОсновныеДействияФормыОбновитьТовары(1);
КонецПроцедуры
Процедура ПустыеГруппы()
СнятиеФлагаПустыхГрупп(1);
КонецПроцедуры
Процедура ОсновныеДействияФормыАвтомат(Кнопка)
ЭтаФорма.ПодключитьОбработчикОжидания("автомат", 3600);
ЭтаФорма.ПодключитьОбработчикОжидания("ПустыеГруппы", 5400);
ЭтаФорма.ЭлементыФормы.ОсновныеДействияФормы.Кнопки.Автомат.Доступность = Ложь;
КонецПроцедуры
d.snissarenko Категория:
Конвертация данных, Обмен, Перенос Загрузка данных из текстовых файлов с выборкой через ADO. Часто бывает потребность загружать данные из текстовых форматов, причем информация для загрузки бьется на 2 и более файлов.
Хорошо бы посредством SQL запроса выбирать данные из этих файлов и производить загрузку! Это вполне возможно и я считаю этот способ наиболее грамотный для решения таких задач!
Имеем 2 файла:
- Head_XXXXX.txt
- Rows_XXXXX.txt
Где XXXXX – порядковой номер пары файлов
Структура строки в Head_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 5 символов – Код контрагента
Колонка3 10 символов – Дата заказа
Колонка4 10 символов – Дата доставки
Колонка5 10 символов – Дата сбора
Колонка6 4 символов – Количество строк в ТЧ
Структура строки в Rows_XXXXX.txt :
Колонка1 20 символов – Номер заказа
Колонка2 7 символов – Артикул номенклатуры
Колонка3 9 символов – Количество в базовых ед. изм.
В каждой паре файлов несколько Заказов.
Необходимо загрузить эти заказы в БД 1С
Для этого воспользуемся Microsoft.Jet.OLEDB.4.0
Для того чтоб данный драйвер корректно понимал структуру файлов необходимо в каталоге расположения данных файлов, перед выполнением запросов, создать специальный текстовый файл schema.ini cо следующими строками:
Код [ Head_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=StoreNum Text Width 5
Col3=DataNote DateTime Width 10
Col4=DataDev DateTime Width 10
Col5=DataDes DateTime Width 10
Col6=CountLine Long Width 4
[Rows_XXXXX]
ColNameHeader=False
Format=FixedLength
Col1=NumberNote Text Width 20
Col2=Articul Text Width 7
Col3=Counts Double Width 9
Как видим, здесь мы задаем структуру таблицы из файла.
Остается только выполнить запрос к полученной текстовой БД и обработать результат:
Ниже приведен пример кода для платформы 1С 8:
Код 1C v 8.х // Загружает данные из текстовых данных
// Параметры
// Стр_КаталогДанных - <Строка>
// Автор: Gmix 04.05.2006 12:22:09
// Возвращаемое значение:
// <Булево>
Функция ЗагрузитьДанныеИзtxt(Стр_КаталогДанных)
// проверки заполнения
ОБ_ФайлДанных=Новый Файл(Стр_КаталогДанных);
Если НЕ ОБ_ФайлДанных.ЭтоКаталог() Тогда
Сообщить("Необходимо указать каталог данных!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
Если НЕ ОБ_ФайлДанных.Существует() Тогда
Сообщить("Каталог """+Стр_КаталогДанных+""" не существует!",СтатусСообщения.ОченьВажное);
Возврат Ложь;
КонецЕсли;
ОБ_АДОКонект = Новый COMОбъект("ADODB.Connection");
ОБ_АДОРекордсетШапка = Новый COMОбъект("ADODB.Recordset");
ОБ_АДОРекордсетСтроки = Новый COMОбъект("ADODB.Recordset");
//Определяем пару файлов
Стр_ОкончаниеФайла="";
ФайлыШапок = НайтиФайлы(Стр_КаталогДанных, "Head_*.txt");
Для каждого ФайлШапки Из ФайлыШапок Цикл
Стр_ОкончаниеФайла=Сред(ФайлШапки.ИмяБезРасширения,6);
Стр_таблицаШапки=ФайлШапки.Имя;
Стр_ТаблицаСтрок="Rows_"+Стр_ОкончаниеФайла+".txt";
Стр_ИмяФайлСтрок=ДобавлениеСлеша(Стр_КаталогДанных)+Стр_ТаблицаСтрок;
ФайлСтрок=Новый Файл(Стр_ИмяФайлСтрок);
Если НЕ ФайлСтрок.Существует() Тогда
Сообщить("Не найден файл строк для файла шапки """+Стр_таблицаШапки+"""! Пара файлов не обработана",СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
//Создаем схему данных
ФайлСхемыДанных=Новый Файл(ДобавлениеСлеша(Стр_КаталогДанных)+"schema.ini");
Если ФайлСхемыДанных.Существует() Тогда
Попытка
УдалитьФайлы(ФайлСхемыДанных.Путь,ФайлСхемыДанных.Имя);
Исключение
Сообщить("Не возможно удалить файл """+ФайлСхемыДанных.ПолноеИмя+""" для создания новой схемы данных! Проверте атрибуты файла",СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
КонецЕсли;
Стр_СхемаДанныхТхт="["+Стр_таблицаШапки+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=StoreNum Text Width 5
|Col3=DataNote DateTime Width 10
|Col4=DataDev DateTime Width 10
|Col5=DataDes DateTime Width 10
|Col6=CountLine Long Width 4
|["+Стр_ТаблицаСтрок+"]
|ColNameHeader=False
|Format=FixedLength
|Col1=NumberNote Text Width 20
|Col2=Articul Text Width 7
|Col3=Counts Double Width 9";
ТекстСхемы=Новый ЗаписьТекста(ФайлСхемыДанных.ПолноеИмя, КодировкаТекста.ANSI);
ТекстСхемы.Записать(Стр_СхемаДанныхТхт);
ТекстСхемы.Закрыть();
// Создаем коннект
Попытка
ОБ_АДОКонект.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Стр_КаталогДанных+";Extended Properties='text;FMT=Delimit ed;HDR=NO'");
Исключение
Сообщить("Невозможно открыть соединение!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Стр_SQL = "S_elect * FROM "+Стр_таблицаШапки;
Попытка
ОБ_АДОРекордсетШапка=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Пока НЕ ОБ_АДОРекордсетШапка.EOF Цикл
// Заказ
Стр_НомерЗаказа = ОБ_АДОРекордсетШапка.Fields("NumberNote").Value;
Стр_КодКА= ОБ_АДОРекордсетШапка.Fields("StoreNum").Value;
Д_ДатаЗаказа= ОБ_АДОРекордсетШапка.Fields("DataNote").Value;
Д_ДатаДоставки= ОБ_АДОРекордсетШапка.Fields("DataDev").Value;
Д_ДатаСбора= ОБ_АДОРекордсетШапка.Fields("DataDes").Value;
Ч_КоличествоСтрок = ОБ_АДОРекордсетШапка.Fields("CountLine").Value;
Сообщить("Заказ № "+Стр_НомерЗаказа+" от " +Д_ДатаЗаказа+ " Код контрагента: "+Стр_КодКА+" Дата доставки: "+Д_ДатаДоставки);
// Обработка строк заказа
Стр_SQL = "S_elect * FROM "+Стр_ТаблицаСтрок+" WHERE NumberNote='"+Стр_НомерЗаказа+"'";
Попытка
ОБ_АДОРекордсетСтроки=ОБ_АДОКонект.Execute(Стр_SQL);
Исключение
Сообщить("Ошибка выполнения запроса """+Стр_SQL+"""!"+ОписаниеОшибки(),СтатусСообщения.Важное);
Возврат Ложь;
КонецПопытки;
Сч=0;
Сообщить(" № Артикул Количество");
Пока НЕ ОБ_АДОРекордсетСтроки.EOF Цикл
//Заполняем таб часть документа
Сч=Сч+1;
Стр_Артикул=СокрЛП(ОБ_АДОРекордсетСтроки.Fields("Articul").Value);
Ч_Количество=ОБ_АДОРекордсетСтроки.Fields("Counts").Value;
Сообщить(""+Сч+" " +Стр_Артикул+ " "+Ч_Количество);
ОБ_АДОРекордсетСтроки.MoveNext();
КонецЦикла;
ОБ_АДОРекордсетШапка.MoveNext();
КонецЦикла;
КонецЦикла;
Возврат Истина;
КонецФункции
Автор
Журавлев Михаил Викторович Категория:
JSON, XML, TXT, CSV, DBF Функция формирует объект Структура, содержащая метаданные 77 для составления прямых запросов Код 1C v 8.х Функция ЗагрузитьМетаданные(КаталогИБ, ИмяПользователяV7, ПарольПользователяV7) Экспорт
МД = Новый Структура;
Состояние("Подключение к " + КаталогИБ);
V7 = Новый COMОбъект("V77.Application");
Если V7.Initialize(V7.RMTrade, "/d"""+КаталогИБ+""" /n"+ИмяПользователяV7+" /p"+ПарольПользователяV7, "NO_SPASH_SHOW") = 0 Тогда
Сообщить("Нет доступа к информационной базе.");
Возврат Ложь;
КонецЕсли;
MDW = V7.CreateObject("MetaDataWork");
MD = V7.Метаданные;
Состояние("Загрузка справочников..");
Ст1 = Новый Структура;
МД.Вставить("Справочник", Ст1);
Для Номер1 = 1 По MD.Справочник() Цикл
МДСправочник = MD.Справочник(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДСправочник.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДСправочник));
Для Номер2 = 1 По МДСправочник.Реквизит() Цикл
МДРеквизит = МДСправочник.Реквизит(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Состояние("Загрузка перечислений..");
Ст1 = Новый Структура;
МД.Вставить("Перечисление", Ст1);
Для Номер1 = 1 По MD.Перечисление() Цикл
МДПеречисление = MD.Перечисление(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДПеречисление.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДПеречисление));
Для Номер2 = 1 По МДПеречисление.Значение() Цикл
МДЗначение = МДПеречисление.Значение(Номер2);
Ст2.Вставить(МДЗначение.Идентификатор, V7.EvalExpr("_idtostr("+MDW.ИДОбъекта(МДЗначение)+")")+" ");
КонецЦикла;
КонецЦикла;
Состояние("Загрузка документов..");
Ст1 = Новый Структура;
МД.Вставить("Документ", Ст1);
Для Номер1 = 1 По MD.Документ() Цикл
МДДокумент = MD.Документ(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДДокумент.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДДокумент));
Для Номер2 = 1 По МДДокумент.РеквизитШапки() Цикл
МДРеквизит = МДДокумент.РеквизитШапки(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
Для Номер2 = 1 По МДДокумент.РеквизитТабличнойЧасти() Цикл
МДРеквизит = МДДокумент.РеквизитТабличнойЧасти(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Состояние("Загрузка регистров..");
Ст1 = Новый Структура;
МД.Вставить("Регистр", Ст1);
Для Номер1 = 1 По MD.Регистр() Цикл
МДРегистр = MD.Регистр(Номер1);
Ст2 = Новый Структура;
Ст1.Вставить(МДРегистр.Идентификатор, Ст2);
Ст2.Вставить("ИД", MDW.ИДОбъекта(МДРегистр));
Для Номер2 = 1 По МДРегистр.Измерение() Цикл
МДИзмерение = МДРегистр.Измерение(Номер2);
Ст2.Вставить(МДИзмерение.Идентификатор, MDW.ИДОбъекта(МДИзмерение));
КонецЦикла;
Для Номер2 = 1 По МДРегистр.Ресурс() Цикл
МДРесурс = МДРегистр.Ресурс(Номер2);
Ст2.Вставить(МДРесурс.Идентификатор, MDW.ИДОбъекта(МДРесурс));
КонецЦикла;
Для Номер2 = 1 По МДРегистр.Реквизит() Цикл
МДРеквизит = МДРегистр.Реквизит(Номер2);
Ст2.Вставить(МДРеквизит.Идентификатор, MDW.ИДОбъекта(МДРеквизит));
КонецЦикла;
КонецЦикла;
Константы.МетаданныеУдаленнойИБ.Установить(Новый ХранилищеЗначения(МД));
Возврат Истина;
КонецФункции
Формируется конечно не быстро, но Структура - объект сериализуемый, поэтому ее надо просто хранить в ХранилищеЗначения в базе 8ки, и восстанавливать перед каждым переносом данных, а не формировать заново. Обновлять ее можно периодически при изменении конфигурации, ито если изменения влияют на перенос данных.
Обратите внимание: все идентификаторы объектов в 10ой системе, а идентификаторы значений перечислений в 36ой.
Dmit rO Категория:
COM-объекты, WMI, WSH Установка ключей защиты для 8.1 1)НЕ СТАВЬТЕ МЕНЕДЖЕР ЛИЦЕНЗИЙ В ТЕРМИНАЛЕ (точнее устанавливайте в 0-й сессии, запуская %SystemRoot%system32mstsc.exe /console
2) сначала ставьте менеджер лицензий, и только потом устанавливайте сетевой ключ
3) если клиент 1С 8.0 видит ключ, это не значит что увидит 8.1 (файл теперь обычно C:Program Files1cv81inconf
ethasp.ini)
4) в терминале локальные ключи не видны, надо в nethasp.ini прописывать в явном виде место расположения сетевого ключа и менеджера лицензий
NH_SERVER_ADDR = 192.168.159.1 ;;(IP-адрес должен быть правильный)
5) клиент 8.1 сначала ищет локальный ключ и если его находит, никогда не будет искать сетевой
6) несколько сетевых ключей или локальный и сетевой ключ на один компьютер ставить нельзя
7) для серверной части 1С надо бывают ТОЛЬКО ЛОКАЛЬНЫЕ НЕ КЛИЕНТСКИЕ ключи
Здорово серверный 64 битный ключ (он зеленый) поддерживает 32битный сервер, в том числе 8.0, но серверный 32битный ключ не поддерживает 64битный сервер 1С
9) для SQL ключей не надо, он не проверяет даже купленные свои лицензии, но покупать их надо : )
10) если большая нагрузка в сети и много клиентов, то менеджер лицензий может не успеть выдать лицензию : ), чтобы это решить, увеличьте интервал опроса к менеджера лицензий клиентов в C:Program Files1cv81inconf
ethasp.ini
NH_SESSION = 5
NH_SEND_RCV = 4
NH_USE_BROADCAST = Disabled
И ограничьте в C:Program FilesAladdinHASP LM nhsrv.ini компьютеры с которых могут подключаться пользователи, например
NHS_IP_LI
MIT = 10.24.2.18-99
11) для 64битных менеджеров лицензий или просто свежие скачайте драйвера с http://www.aladdin.ru/support/download/category260
12) на сервере с менеджером лицензий должен быть статический ip-адрес
13) при большом количестве пользователей раздавайте менеджеры лицензий для каждого клиента персонально, указывая конкретный компьютер
NH_SERVER_ADDR = 192.168.159.1 ;;(IP-адрес должен быть правильный)
Источник: http://www.gilev.ru Категория:
Администрирование