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

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

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

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

ВЫРАЗИТЬ(ЦеныМагазина.Цена КАК ЧИСЛО(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С? Очень просто, ведь есть функция прописи денежных величин. Чтобы исключить ошибки, необходимо получить пропись числа в определенной валюте и из полученной строки вырезать нужную часть.

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

Оформление строк табличной части документа

Часто для улучшения информативности табличной части возникает необходимость как-то выделить важные элементы. Наверное это в первую очередь от того, что человек воспринимает визуальную информацию быстрее и легче. Особенно это актуально для девушек-бухгалтеров, как вы думаете, что им легче понять — то, что в поле «Процент изменения цены» стоит число «-2.035» или то, что поле цена окрашено в зеленый цвет?

Для решения этой задачи в 1С 8.2, в управляемых формах, присутствует элемент формы — «Условное оформление». Чтобы его найти нужно в конструкторе формы выделить самый верхний элемент дерева «Форма», в списке свойств справа в разделе «Оформление» будет пункт «УсловноеОформление». При нажатии на ссылку возле пункта, откроется окно настроек, в нем очень просто разобраться — необходимо указать способ оформления, т.е. цвет фона, текста, шрифт и так далее, затем указать поля, которые нужно оформить и условие, при выполнении которого будет применено оформление.

Читать далее