г. Санкт-Петербург
Войти
Логин
Пароль
Зарегистрироваться
После регистрации на сайте вам будет доступно отслеживание состояния заказов, личный кабинет и другие новые возможности
Заказать звонок
Логин
Пароль
Зарегистрироваться
После регистрации на сайте вам будет доступно отслеживание состояния заказов, личный кабинет и другие новые возможности
Логин
Пароль
Зарегистрироваться
После регистрации на сайте вам будет доступно отслеживание состояния заказов, личный кабинет и другие новые возможности


1
4
5
6
7
8
9
10
11
12
13
Обработка для проверки QR кодов по поставщикам реализациям и возвратам
 

Задача разбивается на следующие части:

[LIST] [*]Получение QR-кодов из заданных документов. [*]Изучение АПИ Честного Знака. [*]Получение информации о QR-кодах с использованием АПИ Честного Знака. [/LIST]

Для работы с Честным Знаком необходимо установить Крипто-провайдера (КриптоПро), получить в Честном Знаке сертификат, и импортировать его на предполагаемом рабочем месте, где будет запускаться обработка (здесь этот процесс не описывается).

Обработка устроена по пошаговому принципу:

- Авторизация на сайте Честного знака. - Выбор документа, о QR-кодах которого необходимо получить информацию (сейчас используются документы 4-х типов - ВозвратТоваровПоставщику, ВозвратТоваровОтПокупателя, ПоступлениеТоваров, РеализациТоваровИУслуг).

- Непосредственно получение информации о владельце QR-кода и его статусе (выбыл, в обороте, и т.д.)

При выполнении длительных операций запросы выполняются пакетным способом, по несколько позиций за раз.

(напишите оператору для получения обработки)

Отключение DFSS системы ограничения ресурсов на 2008r2 и выше серверах
 
[TABLE][TR][TD]2 3 4 5 6 7 8 9 10 11 [/TD][TD]0. запускаем powershell от админа 1. выполняем команду: gwmi win32_terminalservicesetting -N "root\cimv2\terminalservices").enabledfss 2. Dynamic Fair Share Scheduling - позволяет балансировать и распределять ресурсы CPU между пользователями Если в выводе 0 значит балансировка выключена. Скорее всего дальнейшие действия не требуются. 3. На всякий случай проверяем ветки реестра. Запускаем regedit. 4. Ветка HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Quota System параметр EnableCpuQuota на 0 5. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TSFairShare\Disk параметр EnableFairShare на 0 6. Если сделали изменения в реестре, то перезагружаем сервер. [/TD][/TR][/TABLE]
Ошибка: Не задан режим лицензирования для сервера узла сеансов удаленных рабочих столов, При настройке нового узла RDS фермы на Windows Server 2012 R2/2016/2019 вы можете столкнуться со следующим всплывающим предупреждением, которое появляется в трее:
 
При настройке нового узла RDS фермы на Windows Server 2012 R2/2016/2019
вы можете столкнуться со следующим всплывающим предупреждением, которое
появляется в трее:
[CODE]Licensing mode for the Remote Desktop Session Host is not configured.
Remote Desktop Service will stop working in xxx days.[/CODE][CODE]Не задан режим лицензирования для сервера узла сеансов удаленных рабочих
столов.
Служба удаленных рабочих столов перестанет работать через xxx
дней.

[/CODE]
Для более точной диагностики проблемы нужно запустить “Средство диагностики лицензирования удаленных рабочих столов” — lsdiag.msc (Administrative Tools -> Remote Desktop Services -> RD Licensing Diagnoser). В окне утилиты будет отображаться такая ошибка:
[CODE]Не задан режим лицензирования для сервера узла сеансов удаленных рабочих столов
[/CODE]
[IMG WIDTH=468 HEIGHT=351]https://winitpro.ru/wp-content/uploads/2018/03/ne-zadan-rezhim-licenzirovaniya-dlya-servera-uzla-sea.png[/IMG]

Все это говорит о том, что администратор не задал для этого хоста сервер лицензирования RDS и/или
режим лицензирования. Это несмотря на то, что при развертывании хоста
RDS уже был указан тип лицензирования (Configure the deployment -> RD
Licensing).

[IMG WIDTH=490 HEIGHT=210]https://winitpro.ru/wp-content/uploads/2018/03/rds-deployment.png[/IMG]


Отройте консоль PowerShell и проверьте, задан ли сервер лицензирования RDS с помощью следующих команд:

$obj = gwmi -namespace "Root/CIMV2/TerminalServices" Win32_TerminalServiceSetting
$obj.GetSpecifiedLicenseServerList()

$obj. SetSpecifiedLicenseServerList("computername")

где computername = имя компьютера вашего сервера.

Параметры сервера лицензирования RDS также можно задать через политики GPO (локальную или доменную политику).

Если сервер RDS находится в рабочей группе (не добавлен в домен Active Directory), используйте локальный редактор политик gpedit.msc. Перейдите в раздел Конфигурация компьютера -> Компоненты Windows -> Службы удаленных рабочих столов -> Узел сеансов удаленных рабочих столов -> Лицензирование (Computer Configuration -> Administrative Templates -> Windows Components -> Remote Desktop Services -> Remote Desktop Session Host -> Licensing).

[B]Нас интересуют две политики:[/B]

[LIST]
[*]Использовать указанные серверы лицензирования удаленных рабочих столов (Use
the specified Remote Desktop license servers) — включите политику и
укажите адрес сервера лицензирования RDS. Если сервер лицензий RDS CAL
запущен на этом же сервере, укажите 127.0.0.1;
[/LIST]

[IMG WIDTH=634 HEIGHT=307]https://winitpro.ru/wp-content/uploads/2018/03/ispolzovat-ukazannye-servery-licenzirovaniya-udal.png[/IMG]

После перезагрузки сервера откройте средство диагностики лицензирования RDS. Если вы все настроили правильно, должно появится число доступных RDS лицензий и указан режим лицензирования.

[IMG WIDTH=501 HEIGHT=239]https://winitpro.ru/wp-content/uploads/2018/03/rds-server-licenzirovan-polzovatelskie-licenzi.png[/IMG]

Дополнительно установите утилиту для диагностики проблем лицензирования на серверах RDS — Remote Desktop Licensing Diagnoser (lsdiag.msc),

которую можно установить с помощью Server Manager: Features -> Remote Server Administration Tools -> Role Administration Tools -> Remote Desktop Services Tools -> Remote Desktop Licensing Diagnoser Tools

(по умолчанию при установке службы RDS-Licensing устанавливается только консоль Remote Desktop Licensing Manager — licmgr.exe).

licmgr.exe

Установка сервера терминалов в Windows Server 2016
 
Установка сервера терминалов в Windows Server 2016


Что будем делать?


[LIST]
[*]Подключение к серверу терминалов
[*]Установка лицензий на сервер лицензирования службы удаленных рабочих столов
[*]Определение сервера лицензирования для службы удаленных рабочих столов
[*]Установка службы удаленных рабочих столов
[/LIST]


Что понадобится?


[LIST]
[*]Компьютер (сервер) с установленной на нем Windows Server 2016 и права администратора на данном сервере.
[*]Действительная
клиентская лицензия сервера терминалов, приобретенная по одной из
существующих программ лицензирования. (В данной случае я буду
использовать найденный в интернете номер соглашения, по программе
Enterprise Agriment. На момент написания рабочими были номера: 6565792,
5296992, 3325596, 4965437, 4526017.)
[*]Доступ к сети Internet для активации сервера лицензирования и установки лицензий (возможна также активация и по телефону).
[/LIST]


Установка службы удаленных рабочих столов



1) Запускаем Диспетчер серверов.

Его можно запустить с ярлыка на панели задач, или же выполнив команду servermanager.exe (Для этого необходимо нажать комбинацию клавиш Win + R, в появившемся окне в поле «Открыть» (Open) написать имя команды и нажать «ОК» )

2) В меню, в верхнем правом углу, выбираем «Управление» (Manage) — «Добавить роли и компоненты» (Add Roles and Features).

Запустится
«Мастер добавления ролей и компонентов» (Add Roles and Features
Wizard). Нажимаем «Далее» (Next) на начальной странице.
[LIST]
[*]Оставляем
переключатель на «Установка ролей и компонентов» (Role-based or
features-based installation) и снова жмем «Далее» (Next) .
[*]Выбираем
тот сервер из пула серверов, на который будет установлена служба
терминалов. В моем примере это данный локальный сервер. Нажимаем «Далее»
(Next)
[*]Отмечаем роль «Службы удаленных рабочих столов» (Remote Desktop Services) в списке ролей и жмем «Далее» (Next) .
[*]Компоненты оставляем в том виде, в котором они есть. Ничего не отмечая жмем «Далее» (Next) .
[*]Читаем описание службы удаленных рабочих столов и нажимаем «Далее» (Next) .
[/LIST]
3) Теперь необходимо выбрать устанавливаемые службы ролей.

[LIST]
[*] Как
минимум нам пригодится «Лицензирование удаленных рабочих столов»
(Remote Desktop Licensing) (также соглашаемся на установку
дополнительных компонент нажав на «Добавить компоненты» (Add Features) в
появившемся мастере)
[*]и «Узел сеансов удаленных рабочих столов»
(Remote Desktop Session Host) (опять соглашаемся на установку
дополнительных компонент нажав на «Добавить компоненты» (Add Features) в
открывшемся окне).
[*]Отметив необходимы службы ролей, нажимаем «Далее» (Next) .
[/LIST]

Все параметры установки роли определены. На последней странице установим флаг «Автоматический перезапуск конечного сервера, если требуется» (Restart the destination server automatically if required), подтвердим выбор нажав «Да» (Yes) в появившемся окне и нажмем «Установить» (Install) для запуска установки службы. Если все прошло хорошо, после перезагрузки, увидим сообщение об успешной установке всех выбранных служб и компонент.

Нажимаем «Закрыть» (Close) для завершения работы мастера.


Определение сервера лицензирования для службы удаленных рабочих столов


1) Запустим «Средство диагностики лицензирования удаленных рабочих столов» (RD Licensing Diagnoser).

Сделать это можно из диспетчера серверов, выбрав в правом верхнем меню «Средства» (Tools) — «Terminal Services» — «Средство диагностики лицензирования удаленных рабочих столов» (RD Licensing Diagnoser) .Здесь мы видим, что доступных лицензий пока нет, т. к. не задан режим лицензирования для сервера узла сеансов удаленных рабочих столов.Сервер лицензирования указывается теперь в локальных групповых политиках.

2) Для запуска редактора выполним команду gpedit.msc.

Откроется редактор локальной групповой политики. В дереве слева раскроем вкладки:

[LIST]
[*]«Конфигурация компьютера» (Computer Configuration)
[*]«Административные шаблоны» (Administrative Templates)
[*]«Компоненты Windows» (Windows Components)
[*]«Службы удаленных рабочих столов» (Remote Desktop Services)
[*]«Узел сеансов удаленных рабочих столов» (Remote Desktop Session Host)
[*]«Лицензирование» (Licensing)
[/LIST]
3) Откроем
параметры «Использовать указанные серверы лицензирования удаленных
рабочих столов» (Use the specified Remote Desktop license servers).

В окне редактирования параметров политики, переставим переключатель в «Включено» (Enabled) .
Затем необходимо определить сервер лицензирования для службы удаленных рабочих столов.
В моем примере сервер лицензирования находится на этом же физическом сервере. Указываем сетевое имя или IP-адрес сервера лицензий и нажимаем «ОК» .

4) Далее меняем параметры политики.

«Задать режим лицензирования удаленных рабочих столов» (Set the Remote licensing mode) .Также устанавливаем переключатель в «Включено» (Enabled) и указываем режим лицензирования для сервера узла сеансов удаленных рабочих столов.

Возможны 2 варианта: «На пользователя» (Per User) «На устройство» (Per Device)
Предположим, у Вас есть 5 лицензий.
При режиме «На устройство» вы можете создать неограниченное число пользователей на сервере, которые смогут подключаться через удаленный рабочий стол только с 5 компьютеров, на которых установлены эти лицензии.Если выбрать режим «На пользователя», то зайти на сервер смогут только 5 выбранных пользователей, независимо с какого устройства они подключаются.

Выбираем тот режим, который наиболее подходит для ваших нужд и нажимаем «ОК».

5) Возвращаемся
в оснастку «Средство диагностики лицензирования удаленных рабочих
столов» (RD Licensing Diagnoser) и видим новую ошибку, указывающую на
то, что сервер лицензирования указан, но не включен.

Для запуска сервера лицензирования переходим в «Диспетчер лицензирования удаленных рабочих столов» (RD Licensing Manager).
Найти его можно в диспетчере серверов, вкладка «Средства» (Tools) — «Terminal Services» — «Диспетчер лицензирования удаленных рабочих столов» (Remote Desktop Licensing Manager) .
Здесь найдем наш сервер лицензирования, со статусом «Не активирован» (Not Activated) . Для активации кликаем по нему правой кнопкой мыши и в контекстном меню выбираем «Активировать сервер» (Activate Server).

[LIST]
[*]Запустится Мастер активации сервера. Жмем «Далее» (Next) на первой странице мастера.
[*]Затем выбираем метод подключения («Авто» (Automatic connection) по умолчанию) и жмем «Далее» (Next) .
[*]Вводим сведения об организации (эти поля обязательны для заполнения) после чего жмем «Далее» (Next) .
[*]Вводим дополнительные сведения об организации (необязательно) и снова нажимаем «Далее» (Next) .
[*]Сервер лицензирования активирован.
[/LIST]
6) Теперь следует установить лицензии.

Для этого нажимаем «Далее» (Next) оставив включенным флаг «Запустить мастер установки лицензий» .
Установка лицензий на сервер лицензирования службы удаленных рабочих столов Нажимаем «Далее» (Next) на начальной странице Мастера установки лицензий.
Затем выбираем необходимую вам программу лицензирования.
В моем примере это «Соглашение «Enterprise Agreement«» .
Жмем «Далее» (Next) .
Вводим номер соглашения и нажимаем «Далее» (Next) .
Указываем версию продукта, тип лицензии и количество лицензий в соответствии с вашей программой лицензирования. Жмем «Далее» (Next) .
Ну и дожидаемся завершения работы мастера установки лицензий с сообщением о том, что запрошенные лицензии успешно установлены.
В диспетчере лицензирования убеждаемся, что сервер работает, а также видим общее и доступное число установленных лицензий.
Ну и наконец возвращаемся в «Средства диагностики лицензирования удаленных рабочих столов» (RD Licensing Diagnoser) и видим, что ошибок нет, а число лицензий, доступных клиентам, соответствует тому, что мы вводили на предыдущем шаге.
На этом установка сервера терминалов в Windows Server 2016 завершена.

Обмен \ получение данных по QR коду от Честного знака через APi
 
Данные взяты с публикации infostart Для доработки оригинал статьи: [URL=https://infostart.ru/public/1276725/]https://infostart.ru/public/1276725/[/URL] [CODE]&НаСервере Процедура ЗаписатьВЖурнал(Данные) Файл = Новый ЗаписьТекста(ПутьКФайламОтветов + "log.txt",,,Истина); Файл.ЗаписатьСтроку(Строка(ТекущаяДата()) + ": " + Данные); Файл.Закрыть(); КонецПроцедуры &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //Поиск доступных сертификатов CAPICOM_CURRENT_USER_STORE = 2; //2 - Искать сертификат в ветке "Личное" хранилища. CAPICOM_MY_STORE = "My"; // Указываем, что ветку "Личное" берем из хранилища текущего пользователя CAPICOM_STORE_OPEN_READ_ONLY = 0; // Открыть хранилище только на чтение oStore = Новый COMОбъект("CAdESCOM.Store"); // Объект описывает хранилище сертификатов oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY); // Открыть хранилище сертификатов // 1 вариант: поиск сертификата по отпечатку //CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0; //Certificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, ОтпечатокСтр); //Рез = Certificates.Item(1); //2 вариант: обходом по коллекции и сравнение с отпечатком Для Каждого ТекСертификат Из oStore.Certificates Цикл НоваяСтрока = Сертификаты.Добавить(); НоваяСтрока.Владелец = ТекСертификат.SubjectName; НоваяСтрока.ПериодС = ТекСертификат.ValidFromDate; НоваяСтрока.ПериодДо = ТекСертификат.ValidToDate; НоваяСтрока.Контейнер = ТекСертификат.PrivateKey.UniqueContainerName; НоваяСтрока.Отпечаток = ТекСертификат.Thumbprint; КонецЦикла; //Запрос = "/api/v3/facade/identifytools/listV2?cisStatus=INTRODUCED&limit=10000"; Запрос = "/api/v3/facade/cis/cis_list?cis=010462007200949521tkHSO<.I)jqC("; Сервер = "ismp.crpt.ru"; ПутьКФайламОтветов = "C:\temp\GISMT\"; КонецПроцедуры &НаКлиенте Процедура СертификатыПриАктивизацииСтроки(Элемент) СертификатДляОбмена = Элемент.ТекущиеДанные.Отпечаток; КонецПроцедуры &НаКлиенте Процедура ПолучитьТокен(Команда) ПолучитьТокенНаСервере(); КонецПроцедуры &НаСервере Процедура ПолучитьТокенНаСервере() // Получение данных для получения токена HTTPСоединение = Новый HTTPСоединение(Сервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL); HTTPЗапрос = новый HTTPЗапрос("/api/v3/auth/cert/key"); HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("GET",HTTPЗапрос); ОтветСтрока = HTTPОтвет.ПолучитьТелоКакСтроку("UTF-8"); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(ОтветСтрока); ДанныеJSON = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); УИД = ДанныеJSON.uuid; ДанныеДляПолученияТокена = ДанныеJSON.data; ЗаписатьВЖурнал("Получение данных /api/v3/auth/cert/key" + Символы.ПС + ДанныеДляПолученияТокена); // Подписание данных для получения токена ДанныеДляПолученияТокена = ПодписатьТекст(ЗашифроватьBase64(ДанныеДляПолученияТокена, КодировкаТекста.UTF8),СертификатДляОбмена,Ложь); ЗаписатьВЖурнал("Подписано сертификатом " + СертификатДляОбмена + Символы.ПС + ДанныеДляПолученияТокена); // Получение токена с использованием подписанных данных Соединение = Новый HTTPСоединение(Сервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL); Заголовки = Новый Соответствие; Заголовки.Вставить("Content-Type", "application/json; charset=UTF-8"); Заголовки.Вставить("Accept", "application/json"); HTTPЗапрос = Новый HTTPЗапрос("/api/v3/auth/cert/",Заголовки); ЗаписьJOIN = Новый ЗаписьJSON; ЗаписьJOIN.УстановитьСтроку(); ДанныеДляЗапроса = Новый Структура; ДанныеДляЗапроса.Вставить("uuid",УИД); ДанныеДляЗапроса.Вставить("data",ДанныеДляПолученияТокена); ЗаписатьJSON(ЗаписьJOIN,ДанныеДляЗапроса); СтрокаДляЗапроса = ЗаписьJOIN.Закрыть(); HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаДляЗапроса,КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос); ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); Токен = ПрочитатьJSON(ЧтениеJSON, Ложь).token; КонецПроцедуры &НаСервере Функция ЗашифроватьBase64(Строка, Кодировка) Экспорт ИмяВременногоФайла = ПолучитьИмяВременногоФайла(); ЗаписьТекста = Новый ЗаписьТекста(ИмяВременногоФайла, Кодировка); ЗаписьТекста.Записать(Строка); ЗаписьТекста.Закрыть(); Двоичные = Новый ДвоичныеДанные(ИмяВременногоФайла); Результат = Base64Строка(Двоичные); Если Лев(Результат, 4) = "77u/" Тогда Результат = Сред(Результат, 5); КонецЕсли; Результат = СтрЗаменить(Результат, Символы.ПС, ""); УдалитьФайлы(ИмяВременногоФайла); Возврат Результат; КонецФункции &НаСервере // sThumbprint - отпечаток сертификата, используемого для подписи; строка, // представляющая отпечаток в шестнадцатеричном виде // пример 195934d72dcdf69149901d6632aca4562d8806d8 // ТекстДляПодписи должен быть в Base64 // bDetached - Истина/Ложь - откреплённая(для подписания документов)/прикреплённая(для получения токена авторизации) подпись Функция ПодписатьТекст(ТекстДляПодписи, sThumbprint, bDetached) CADESCOM_BASE64_TO_BINARY = 1; // Входные данные пришли в Base64 CADESCOM_CADES_TYPE = 1; // Тип усовершенствованной подписи CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME = 0; // Атрибут штампа времени подписи oSigner = Новый COMОбъект("CAdESCOM.CPSigner"); // Объект, задающий параметры создания и содержащий информацию об усовершенствованной подписи. oSigner.Certificate = ПолучитьСертификатПоОтпечатку(sThumbprint); oSigningTimeAttr = Новый COMОбъект("CAdESCOM.CPAttribute"); oSigningTimeAttr.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME; oSigningTimeAttr.Value = ТекущаяДата(); oSigner.AuthenticatedAttributes2.Add(oSigningTimeAttr); ТекстДляПодписи = СокрЛП(ТекстДляПодписи); oSignedData = Новый COMОбъект("CAdESCOM.CadesSignedData"); // Объект CadesSignedData предоставляет свойства и методы для работы с усовершенствованной подписью. oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY; oSignedData.Content = СокрЛП(ТекстДляПодписи); EncodingType = 0; sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_TYPE, bDetached, EncodingType); // Метод добавляет к сообщению усовершенствованную подпись. Возврат sSignedMessage; // Подпись в формате Base64 КонецФункции &НаСервере //Отпечаток - строка HEX Функция ПолучитьСертификатПоОтпечатку(ОтпечатокСтр) Рез = Неопределено; // Найденный сертификат (Com-объект) CAPICOM_CURRENT_USER_STORE = 2; //2 - Искать сертификат в ветке "Личное" хранилища. CAPICOM_MY_STORE = "My"; // Указываем, что ветку "Личное" берем из хранилища текущего пользователя CAPICOM_STORE_OPEN_READ_ONLY = 0; // Открыть хранилище только на чтение oStore = Новый COMОбъект("CAdESCOM.Store"); // Объект описывает хранилище сертификатов oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY); // Открыть хранилище сертификатов // 1 вариант: поиск сертификата по отпечатку //CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0; //Certificates = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, ОтпечатокСтр); //Рез = Certificates.Item(1); //2 вариант: обходом по коллекции и сравнение с отпечатком Для Каждого ТекСертификат Из oStore.Certificates Цикл ТекОтпечаток = ТекСертификат.Thumbprint; // возвращается отпечаток в шестнадцатеричном виде Если ВРЕГ(ТекОтпечаток) = ВРЕГ(ОтпечатокСтр) Тогда Рез = ТекСертификат; Прервать; КонецЕсли; КонецЦикла; oStore.Close(); // Закрыть хранилище сертификатов и освободить объект 61 Возврат Рез; КонецФункции &НаКлиенте Процедура ОтправитьЗапрос(Команда) ОтправитьЗапросНаСервере(); КонецПроцедуры &НаСервере Процедура ОтправитьЗапросНаСервере() HTTPСоединение = Новый HTTPСоединение(Сервер,443,,,,,Новый ЗащищенноеСоединениеOpenSSL); HTTPЗапрос = новый HTTPЗапрос(Запрос); HTTPЗапрос.Заголовки.Вставить("Authorization","Bearer "+Токен); HTTPОтвет = HTTPСоединение.ВызватьHTTPМетод("GET",HTTPЗапрос); Сообщить(HTTPОтвет.КодСостояния); ИмяФайлаОтвета = ПутьКФайламОтветов + Строка(Новый УникальныйИдентификатор)+".json"; HTTPОтвет.ПолучитьТелоКакДвоичныеДанные().Записать(ИмяФайлаОтвета); ЗаписатьВЖурнал("Запрос: " + Запрос + Символы.ПС + "Ответ: " + ИмяФайлаОтвета); КонецПроцедуры [/CODE]
Изменено: pilot - 19.05.2021 20:19:09
Модуль обмена для передачи Скидок из 1С в БУС Битрикс, Основная проблема порталов в отсутствии данных о скидках передаваемых из системы 1С в Битрикс, предлагаемое решение решает вопросы выгрузки данных из 1С
 
Очень много написано о выгрузке битрикс но весьма пространно затронута часть по работе скидок в системе битрикс-1С.

БУС или (Битрикс Управление Сайтом) - в базе умеет работать со скидками, но напрочь отсутствует функционал позволяющий загружать эти скидки и уж тем более синхронизировать это с пользователями.

При создании модуля мы учли три типа скидок наиболее часто используемые компаниями

Это скидки:

[LIST=1]
[*]По самой Номенклатуре ( Конкретной позиции)
[*]Скидка целиком на Бренд
[*]Скидка на Раздел (Товарный каталог)
[/LIST]Созданный модуль позволяет выгружать в сторону 1С и в последствии получать цену клиентов в заказы обратно в 1С.

Со стороны 1С мы выгружаем файлы содержащие идентификатор каждого контрагента, а именно 1С UID что обеспечивает 100% совпадение при загрузке.

Т.к на этапе загрузки выясняется что контрагенты могут иметь одинаковые ИНН, е-мейлы и прочие реквизиты, что не дает 100% гарантии, что такой элемент будет уникален.


[B]Выгрузка позволяет:
[/B]
Возможности:
Выгружать целиком всех контрагентов с признаком "Клиент b2b"

Выгружать е-мейл адреса, договоры контрагентов, ИНН , Наименование и прочие сопутствующие реквизиты Справочника 1С - "Номенклатура"

Выгружать привязанных Менеджеров к клиентам, а также их телефоны и адреса для быстрой связи.

Выгружать взаиморасчеты в виде акта с динамическим отбором по датам.



Модуль уведомляет менеджера на почту (при необходимости SMS, о поступлении нового заказа из Битрикс b2b - кабинета)

[B]Совместимость:[/B]

Выгрузка строится на любой стандартной конфигурации 1С, Тестированные конфигурации УТ10.3 , УТ11,4 , КАА

[B]Совместимость с решениями Битрикс:
[/B]
Для снижения стоимости разработки модуль - Скидок - Цен - Клиентов может быть интегрирован в любое решение на базе Битрикс Управление сайтом - с поддержкой корзины и личного кабинета.

[B]Оптимизация
[/B]
На этапе выгрузки данных о контрагентах в базовой версии корзины и каталога можно будет столкнуться с проблемой быстродействия.

Даже на самых быстрых конфигурация хостинга в базовой версии реализации корзины присутствуют проблемы производительности, а скорость работы каталога свыше 300 пользователей будет не приемлима.

Для ускорения решения от 1С-Битрикс, Добавлена версия модуля позволяющая ускорить вывод каталога со скидками и бонусами более чем в 10раз по сравнению с базовым функционалом.

[B]Стандартизация
[/B]
Модуль построен с соблюдением стандартизации и методики разработки битрикс, но без условно на каком то из этапов потребуется выбирать либо пользоваться штатным функционалом получения цен, либо получить новые возможности.

[B]Дополнительные возможности:
[/B]
[LIST]
[*]Модуль позволяет выгружать данные и скидки контрагентов частично, для более быстрой передачи информации по ценам.
[*]Выгружаться могут как Скидки - (Персональные цены контрагентов), так и "Бонусы", для передачи бонуса при покупке.
[*]Система уведомлений предоставляет данные по каждой прогрузке, таким образом вы всегда знаете какие клиенты находятся в базе сайта.
[/LIST]
Изменено: pilot - 18.05.2021 09:45:41
Поступление антекс май 2021, Ожидается поступление Антенн антенкс
 
Перечень

Антенна AGATA-2 MIMO miniBOX (GSM-1800/3G/WiFi/LTE2600) 17Дб/2*SMA-male/удлинитель USB 10м/без адаптеров 10 Антенна PETRA Lite BOX HOME/ MIMO/ F=1700-2700 МГц./ КУ=9dBi./ удлинитель USB 10м/ Разъемы 2*CRC9 4шт
Антенна MAGNITA-1ЧЕРНАЯ (GSM-1800/3G/WiFi/4G)/круговая/магнитная/7Дб/RG58 3м/SMA-male 8шт
Антенна MAGNITA-2 (GSM-900,1800/3G/WiFi/4G)/круговая/антивандальная/КУ 7Дб/RG-58 2м/SMA-male 4шт
Антенна PETRA BB 75 4шт
Антенна Petra Broad Bend MIMO UniBox-2 (GSM-1800/3G/Wi-Fi+4G MIMO), направленная, тип-панельная/15Дб/USB удлинитель 10м/без адаптеров 20шт
Антенна Petra Broad Bend MIMO UniBox-2 (GSM-1800/3G/Wi-Fi+4G MIMO ), направленная, тип-панельная/15Дб/гермоввод AX-RJ45 Антэкс/ SIM-удлинитель/ без удлинителя USB/без адаптеров 10шт
Антенна Petra Broad Bend MIMO 2x2 (3G + 4G MIMO) ,направленная, тип-панельная/14Дб,2*N-female 4шт
Антенна Petra Broad Bend 75 MIMO 2x2 (3G + 4G MIMO) ,направленная, тип-панельная/14Дб,2*F-female 10шт
Антенна AGATA MIMO 2x2 (3G MIMO + 4G MIMO) , направленная, тип-панельная/17Дб/2*N-female 2шт
Антенна AGATA MIMO BOX (GSM-1800/3G/WiFi/LTE2600) 17Дб/2*SMA-male/удлинитель USB 10м/без адаптеров 4шт
AXS-1 - подставка для панельной антенны Антэкс 2шт
Антенна AGATA-2F MIMO 2x2 (3G MIMO + 4G MIMO 2х2) , направленная, тип-панельная/17Дб/2*F-female 7шт

приобрести можно через каталог: [URL=https://s-alpha.ru/catalog/usilenie_internet_i_mobilnogo_4g_lte_3g/]https://s-alpha.ru/catalog/usilenie_internet_i_mobilnogo_4g_lte_3g/[/URL]
Оптимизация работы со скидками в Битрикс при повышении количества пользователей с разными типами скидок, Необходимость в оптимизации возникает уже после того, как количество активных пользователей переваливает за 100.
 

Необходимость в оптимизации возникает уже после того, как количество активных пользователей переваливает за 100.

В стандартном варианте скидки (правила корзины) считаются динамически, при каждом обновлении страницы.

И при повышении числа пользователей b2b портала или корзины до 1000

Приводит к фактически полному зависанию работы корзины даже на самых мощных конфигурациях

При этом наличие задаваемых вручную скидок, а также мультивалютности еще более осложняет ситуацию со скоростью отображения страницы.

Поэтому было принято решение доработать механизм вывода, так как забирать каждый раз рассчитанную динамически был тоже невыгодно.

В итоге, механизм получения данных и последующего вывода выглядит следующим образом:

1. При выгрузке скидок из 1с для каждого пользователя рассчитываются все его цены из созданных для него правил, и складываются в отдельную таблицу (в текущем варианте в MySQL, работа с другими хранилищами - дело отдельного этапа).

Цены рассчитываются достаточно продолжительное время в сравнении с адекватным временем отображения страницы, поэтому это наиболее удачное место для осуществления данной операции.

2. В компоненте Каталога корзины осуществляется выборка этих данных в JS-переменную, а в JS-компоненте - вывод.

При этом данные выбираются один раз, а дальше кешируются.


Механизм кэширования может пересматриваться в дальнейшем, в зависимости от насущных потребностей в скорости отображения. В текущем варианте используется APC cache, поскольку это стандартный механизм, идущий вместе с самим PHP.

Для работы кэша необходимо поставить соответствующее расширение.
В CentOS 7, на которой построена BitrixVM, это команды:

yum install php-pecl-apcu.x86_64
yum install php-pecl-apcu-bc.x86_64

3. В дальнейшем при росте числа пользователей планируется осуществлять мониторинг и доработки в соответствии с полученными данными (отдельным этапом).

Проблема с удаление оплат и отгрузок на Битрикс при обмене с 1С, УДаляются оплаты после синхронизации заказов с Битрикс (БУС)
 
Иногда возникает проблема и 1С при обмене с Битрикс Управление сайтом затирает оплаты, причём так что их даже не поставить на место

проблема решается не очень красиво но полностью исправлением в модуле

/home/bitrix/www/bitrix/modules/sale/lib/exchange > importonecpackage.php

Инструкцию надо выполнить строго так как написано ниже внимательно!
[CODE]//766-776 строки комментируем

/**if(static::$config & static::DELETE_IF_NOT_FOUND_RELATED_PAYMENT_DOCUMENT)
{
$paymentResult = $this->onBeforePaymentCollectionModify($orderImport, $items);
if(!$paymentResult->isSuccess())
$result->addWarnings($paymentResult->getErrors());
}

$shipmentResult = $this->onBeforeShipmentCollectionModify($orderImport, $items);

if(!$shipmentResult->isSuccess())
$result->addWarnings($shipmentResult->getErrors());**/

778 строка согласно логике комментируем отгрузки и оплаты

/*|| !$shipmentResult->isSuccess() || !$paymentResult->isSuccess()*/
[/CODE]
Взято с форума Битрикс [URL=https://dev.1c-bitrix.ru/support/forum/messages/forum26/topic82031/message531053/#message531053]https://dev.1c-bitrix.ru/support/forum/messages/forum26/topic82031/message531053/#message531053[/URL]
Восстановление оплат и после синхронизации Битрикс с 1С, Иногда при синхронизации Битрикс и БУС (Сайта на битрикс) происходит удаление оплат и отгрузок
 
Есть модуль sale, версии 17.8.14. Есть модуль обмена с 1С, версии 7.0.13.
В текущей реализации модуля при импорте заказов есть только 1 проверка:
если оплата/отгрузка отсутствует в импортируемом файле - то она удаляется. Что и происходит при отключенных выгрузках оплат/отгрузок.

Вариант решения - запоминать и восстанавливать.
Для этого цепляем обработчики на события 'OnBeforeCollectionDeleteItem' и 'OnSaleOrderBeforeSaved' модуля 'sale'.

Первое из них происходит перед удалением элемента коллекции оплат/отгрузок, второе - перед сохранением заказа. Что интересно, для элемента коллекции оплат есть отдельное событие перед удалением: 'OnBeforeSalePaymentEntityDeleted', но вот для элемента коллекции отгрузок аналога нет.


[CODE]use \Bitrix\Main\EventManager;
use \Bitrix\Main\Event;
use \Bitrix\Main\Entity;
use \Bitrix\Sale\Order;
use \Bitrix\Sale\Payment;
use \Bitrix\Sale\PaySystem\Manager;
use \Bitrix\Sale\Shipment;
use \Bitrix\Sale\Helpers\Admin\Blocks\OrderBasketShipment;


$inst = EventManager::getInstance();
$inst-> addEventHandler('sale', 'OnBeforeCollectionDeleteItem', 'saveInfo');
$inst-> addEventHandler('sale', 'OnSaleOrderBeforeSaved', 'reverseInfo');

//Небольшая прослойка, возвращает доступные поля
/**
* @param array $arValues
* @param array $allowedFields
* @return array $result
*/
function checkFields( $arValues, $allowedFields) {
$result = array();
foreach ( $arValues as $key => $value ) {
if ( in_array( $key,$allowedFields ) && !in_array($key, array('ACCOUNT_NUMBER')) ) {
$result[$key] = $value;
}
}
return $result;
}

function saveInfo(\Bitrix\Main\Event $event ) {
/**
* @var \Bitrix\Sale\Shipment|\Bitrix\Sale\Payment $entity
*/
if ( $_SESSION['BX_CML2_EXPORT'] ) {
$entity = $event->getParameter('ENTITY');
if ( $entity instanceof Shipment ) {
if ( !is_array( $_SESSION['BX_CML2_EXPORT']['DELETED_SHIPMENTS'] ) )
$_SESSION['BX_CML2_EXPORT']['DELETED_SHIPMENTS'] = array();
if ( !$entity->isSystem() )
$_SESSION['BX_CML2_EXPORT']['DELETED_SHIPMENTS'][] = checkFields( $entity->getFields()->getValues(), Shipment::getAvailableFields() );
}
if ( $entity instanceof Payment ) {
if ( !is_array( $_SESSION['BX_CML2_EXPORT']['DELETED_PAYMENTS'] ) )
$_SESSION['BX_CML2_EXPORT']['DELETED_PAYMENTS'] = array();
$_SESSION['BX_CML2_EXPORT']['DELETED_PAYMENTS'][] = checkFields( $entity->getFields()->getValues(), Payment::getAvailableFields() );
}
}
else {
return;
}
}

function reverseInfo(\Bitrix\Main\Event $event ) {
/**
* @var \Bitrix\Sale\Order $order
* @var \Bitrix\Sale\ShipmentCollection $shipmentCollection
* @var \Bitrix\Sale\Shipment $shipment
* @var \Bitrix\Sale\PaymentCollection $paymentCollection
* @var \Bitrix\Sale\Payment $payment
* @var \Bitrix\Sale\PropertyValue $somePropValue
* **/
if ( $_SESSION['BX_CML2_EXPORT'] ) {
$order = $event->getParameter("ENTITY");
if ( $_SESSION['BX_CML2_EXPORT']['DELETED_SHIPMENTS'] ) {
//Вернем отгрузки
$shipmentCollection = $order->getShipmentCollection();
$systemShipmentItemCollection = $shipmentCollection->getSystemShipment()->getShipmentItemCollection();$products = array();
$basket = $order->getBasket();
if ($basket)
{
/** @var \Bitrix\Sale\BasketItem $product */
$basketItems = $basket->getBasketItems();
foreach ($basketItems as $product)
{
$systemShipmentItem = $systemShipmentItemCollection->getItemByBasketCode($product->getBasketCode());
if ($product->isBundleChild() || !$systemShipmentItem || $systemShipmentItem->getQuantity() <= 0)
continue;

$products[] = array(
'AMOUNT' => $product->getQuantity(),
'BASKET_CODE' => $product->getBasketCode()
);
}
}
/** @var \Bitrix\Sale\Shipment $obShipment */
/** @var array $shipmentFields */
foreach ( $_SESSION['BX_CML2_EXPORT']['DELETED_SHIPMENTS'] as $shipmentFields ) {
$fg = true;
foreach( $shipmentCollection as $obShipment ) {
if ($obShipment->isSystem())
continue;
$usedFields = checkFields($obShipment->getFields()->getValues(), Shipment::getAvailableFields() );
if ( count( array_diff_assoc( $shipmentFields, $usedFields) ) == 0 )
$fg = false; //доставка с такими полями уже есть
}
if ( $fg ) {
$shipment = $shipmentCollection->createItem();
$shipment->setFields( $shipmentFields );
OrderBasketShipment::updateData($order, $shipment, $products);
}
}
unset( $_SESSION['BX_CML2_EXPORT']['DELETED_SHIPMENTS'] );
}
if ( $_SESSION['BX_CML2_EXPORT']['DELETED_PAYMENTS'] ) {
//Вернем оплаты
$paymentCollection = $order->getPaymentCollection();
/** @var \Bitrix\Sale\Payment $obPayment */
/** @var array $paymentFields */
foreach ( $_SESSION['BX_CML2_EXPORT']['DELETED_PAYMENTS'] as $paymentFields ) {
$fg = true;
foreach( $paymentCollection as $obPayment ) {
$usedFields = checkFields( $obPayment->getFields()->getValues(), Payment::getAvailableFields() );
if ( count( array_diff_assoc( $paymentFields, $usedFields) ) == 0 )
$fg = false; //такая оплата уже есть
}
if ( $fg ) {
$payment = $paymentCollection->createItem();
$payment->setFields( $paymentFields );
}
}
unset( $_SESSION['BX_CML2_EXPORT']['DELETED_PAYMENTS'] );
}
//Проверим сумму заказа
$paymentCollection = $order->getPaymentCollection();
if ( ($sumP = $paymentCollection->getSum() ) != ($sumO = $order->getPrice() ) ) {
$diff = $sumO - $sumP;
$innerPayID = Manager::getInnerPaySystemId();
foreach ( $paymentCollection as $payment ) {
if ( $payment->getPaymentSystemId() != $innerPayID) {
$newVal = floatval($payment->getField("SUM")) + floatval($diff);
$payment->setField("SUM", $newVal);
}
}
}
}
}[/CODE]
1
4
5
6
7
8
9
10
11
12
13