Архив метки: кодинг

Что изменилось?

При сохранении объекта, справочника или документа, в его модуле, в процедуре ПередЗаписью можно легко определить, какие реквизиты объекта изменились. Для этого достаточно сравнить значение по идентификатору со значением через Ссылку. Например, узнаем, что изменилась группа элемента справочника:

Если Родитель <> Ссылка.Родитель Тогда

...

Целое число в запросе

Для округления чисел в запросе необходимо применять функцию ВЫРАЗИТЬ, для отсечения дробной части придется использовать конструкцию ВЫБОР.

Пример округления до целого:

ВЫРАЗИТЬ(ЦеныМагазина.Цена КАК ЧИСЛО(12, 0))

Пример получения целой части (отсечение дробной):

ВЫБОР
КОГДА (ВЫРАЗИТЬ(ЦеныМагазина.Цена КАК ЧИСЛО(12, 0))) > ЦеныМагазина.Цена
ТОГДА (ВЫРАЗИТЬ(ЦеныМагазина.Цена КАК ЧИСЛО(12, 0))) - 1
ИНАЧЕ ВЫРАЗИТЬ(ЦеныМагазина.Цена КАК ЧИСЛО(12, 0))
КОНЕЦ

Предопределенные элементы

В распределенной базе 1с версии 8.2 возникла следующая проблема: при обмене в результате какого-то сбоя появились дубликаты предопределнных элементов в плане характеристик, т.е. все записи имели двойника, все были отмечены как “предопределнный”, имели одинаковый код и т.д. Пытаясь вылечить этот глюк я узнал интересную особенность этих элементов – при удалении такого элемента в базе, что можно сделать только программным способом, он больше не появляется в списке элементов, хотя и присутствует в конфигурации. Получается, что исправить эту ошибку можно только манипуляциями в базе данных, но не манипуляциями в конфигураторе.
Читать далее

WooCommerce

В состав конфигурации “Простой учет” добавлена обработка для поддержки обмена данными с интернет-магазином, использующим плагин WooCommerce для WordPress. Как и с остальными магазинами, есть возможность обновлять цены товаров на сайте по данным из 1С и загружать оставленные покупателями заказы сразу в документ “Расходная накладная”.

В процессе написания обработки пришлось разложить по полочкам схему данных магазина, при этом сначала меня удивила концепция: все основные сведения хранить в таблице posts. Т.е. там лежат и данные о товарах, и данные о заказах, сам WordPress там хранит данные постов. На деле оказалось, что для целей обмена данными к этой таблице обращаться практически не приходится – нужные параметры разбросаны по множеству дополнительных таблиц.

WooCommerce shema

схема связи данных в таблицах WordPress и WooCommerce

Так например, чтобы узнать, есть-ли заказы ожидающие обработки, нужно прочитать из таблицы term_relationships записи со значением поля term_taxonomy_id равным коду статуса “ожидание”. Поле записи object_id будет содержать код заказа, а по сути это id записи в таблице posts соответствующей искомому заказу. Содержимое заказа лежит в таблице woocommerce_itemmeta, здесь надо сделать выборку по полю order_item_id (id заказа) и перечитать содержимое в полях meta_key и meta_value. Это еще одна “фишка” этого плагина: значения записаны не в отдельных полях таблицы, а вписаны в две колонки таблицы по принципу: одна колонка содержит ключ, вторая – значение. Т.е перебирая строки нужно анализировать значения ключа, к примеру в строке с ключом “_qty” получим количество, “_line_total” – сумма товара по строке и т.д. По такому-же принципу “спрятаны” данные и заголовка заказа с именем покупателя, телефоном и прочим, только уже в таблице postmeta.

Проверка заполненности реквизита

Если реквизит имеет ссылочный тип, например, справочник, то если реквизит не заполнен, будем иметь у такого реквизита значение типа “пустая ссылка”. Но если реквизит составной и в качестве возможных типов указаны, к примеру, два справочника, то у пустого реквизита будем иметь “Неопределено”. Столкнулся, когда переделывал документ и сделал одному из реквизитов составной тип – вылезли ошибки в модуле документа при проверке значений в реквизитах.

Проверка типа в запросе

Для того, чтобы проверить тип значения документа (а также и любой другой ссылки) в запросе, используется оператор ССЫЛКА.

Пример текста запроса с проверкой типа документа:

Использование оператора ССЫЛКА в запросе

Использование оператора ССЫЛКА в запросе

Как запретить печать или копирование отчета

Если в целях защиты информации необходимо ограничить возможность пользователя печатать отчет или сохранять его в виде файла или просто копировать данные отчета в буфер обмена, можно воспользоваться несколькими вариантами:

  • отключить в роли пользователя свойство “Вывод”, это будет работать глобально, для всей программы;
  • у конкретного отчета или печатной формы документа при формировании табличного документа установить свойство “Вывод”, пример: ТабДок.Вывод = ИспользованиеВывода.Запретить;
  • если отчет создан с использованием СКД можно установить свойство элемента формы “Результат”, для этого нужно создать саму форму, если ее нет, и в процедуре ПриОткрытии() добавить такой код: Элементы.Результат.Вывод = ИспользованиеВывода.Запретить;

Можно использовать обратные варианты наложения разрешений, например, пользователю нужно запретить любой вывод, но разрешить какой-то отчет, для этого в роль пользователя нужно запретить “Вывод”, а в отчете установить значение вывода ИспользованиеВывода.Разрешить.

Как ограничить пользователя одним сеансом

В восьмой версии 1С нет штатного способа ограничить пользователя использованием только одного сеанса, это сделано потому что теперь при необходимости система может создавать от имени пользователя дополнительные сеансы в которых выполняются какие-то вспомогательные обработки. Например, когда формируется отчет, обработка данных происходит в фоновом задании, которое видно в списке активных пользователей отдельной строкой. С другой стороны это дает возможность пользователям открывать окно приложения несколько раз, на одном или разных компьютерах. Чтобы бороться с этим нужно применять программные методы. Читать далее

Мутабельные объекты

Сижу, перевожу работу конфигурации на клиент-серверный режим, отлавливаю места, где не удается передача данных с клиента на сервер. Получается так, что после того как некоторые из общих модулей были сделаны серверными, т.е. исполняемыми только на сервере, описанные в них функции не работают если в качестве параметра использовался какой-то объект – документ или обработка и т.п. Не работают по той причине, что с клиента на сервер невозможно передать “мутабельный объект”, как говорит отладчик. В многих случаях помогает передача в функцию не “Объекта” а “Ссылки”. Но если параметром был объект-обработка, то понятия ссылки у обработки нет. Тут мне помогла хитрость со структурой. Проанализировав текст функции я понял, что параметр-объект в ней используется только для считывания его свойств, что-то вроде: “Док.Дата”, “Док.Склад” и так далее. Тогда перед вызовом функции я сформировал структуру с нужными свойствами и вставил ее в параметры функции – структура уже не является “мутабельным объектом” и без проблем передается с клиента на сервер.

Число прописью

цифры

цифры

Как получить пропись произвольного числа в 1С? Очень просто, ведь есть функция прописи денежных величин. Чтобы исключить ошибки, необходимо получить пропись числа в определенной валюте и из полученной строки вырезать нужную часть.

Делаем так: устанавливаем режим прописи гривны на нужном языке, применяем функцию Формат(НашеЧисло, “ЧПДС”), из полученной строки вырезаем левую часть до слова “грив”, т.к. могут быть варианты “гривен”, “гривня”, берем без окончания.