World 1C http://world1c.ru Блог для программистов и пользователей платформы 1С:Предприятие Sun, 19 Oct 2014 07:59:28 +0000 ru-RU hourly 1 http://wordpress.org/?v=3.5 Дополнительные реквизиты объектов с помощью плана видов характеристик http://world1c.ru/index.php/dopolnitelnye-rekvizity-s-pomoshhyu-plana-vidov-xarakteristik/ http://world1c.ru/index.php/dopolnitelnye-rekvizity-s-pomoshhyu-plana-vidov-xarakteristik/#comments Mon, 01 Apr 2013 06:00:57 +0000 admin http://world1c.ru/?p=334 Достаточно часто возникает необходимость в добавлении объектам дополнительных реквизитов (характеристик). При этом каждый раз вносить для этого изменения в конфигурацию и проводить реструктуризацию базы данных не хочется. В этой статье я расскажу о том как реализовать такую возможность с помощью плана видов характеристик и регистра сведений и поделюсь парой приёмов использования этих реквизитов в отчётах и списках.

Изменения в конфигурации

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

Выбора типов значений плана видов характеристик

Выбора типов значений плана видов характеристик

В качестве одного из возможных типов значений характеристик выберем предварительно добавленный в конфигурацию справочник “Значения характеристик”, подчиненный плану видов характеристик “Виды характеристик”. Его же выберем в поле “Дополнительные значения характеристик”. Это позволит добавлять характеристики с произвольными ссылочными значениями (например, цвет или размер).

Создадим регистр сведений “Характеристики” с измерениями “Объект”, “Вид характеристики” и ресурсом “Значение”. Измерение “Объект” должно включать в себя все типы объектов для которых необходимо использовать дополнительные реквизиты. В нашем случае это будет справочник “Контрагенты”, В свойствах измерения “Объект” должны быть установлены флаги “Ведущее”, “Основной отбор” и “Запрет незаполненных”.

Регистр сведений "Характеристики"

Свойства измерения “Объект”

Это обеспечит связь объекта с записями регистра сведений. В форме элемента справочника “Контрагенты” переход к редактированию характеристик будет возможен с помощью соответствующего пункта меню “Перейти” в левой части формы. Измерению “Вид характеристики” необходимо назначить тип “ПланВидовХарактеристикСсылка.ВидыХарактеристик”, а ресурсу “Значение” – “Характеристика.ВидыХарактеристик”.

Для обеспечения взаимосвязи значений ресурса “Значение” со значениями измерения “ВидХарактеристик” регистра “Характеристики” необходимо чтобы в свойстве “Связи параметров выбора” ресурса “Значение” было указано “Отбор.Владелец(ВидХарактеристики)”, а в свойстве “Связь по типу” – “ВидХарактеристики”

Свойство ресурса "Значение"

Свойства ресурса “Значения”

Теперь всё готово для того чтобы мы могли вводить в базу данных дополнительные реквизиты справочника “Контрагенты”. Попробуем добавить дополнительный реквизит “Адрес”

Карточка контрагента

Карточка контрагента

Использование дополнительных реквизитов в отчётах и списках

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

Вариант №1

Начнём с использования характеристик в отчёте, разработанном с использованием системы компоновки данных. За основу возьмём отчёт “Ведомость взаиморасчетов”. Добавим в конфигурацию копию этого отчёта и назовём его “Ведомость взаиморасчетов (с характеристиками)”. Оригинал отчёта нам понадобится для демонстрации второго варианта использования характеристик.
Итак, откроем набор данных “Взаиморасчеты” схемы компоновки данных нашего отчета в конструкторе запросов и перейдем на закладку “Характеристики”.

skd_harakteristiki

Вкладка “Характеристики” конструкатора запроса СКД

В таблицу на вкладке “Характеристики” добавим строку. В поле “Тип” выберем “СправочникСсылка.Контрагенты” (это объект для которого в отчёте необходимо использовать дополнительные характеристики). В поле “Источник видов” выберем вариант “Запрос” (хотя в нашем случае можно ограничиться и вариантом “Таблица”). В колонку “Виды характеристик” внесём текст запроса, которым будут выбираться виды характеристик, используемые для справочника “Контрагенты”.

Текст запроса обязательно должен содержать три поля – ссылка на вид характеристики, наименование характеристики и тип значения характеристики. Наименования этих полей выбираются в колонках “Поле ключа”, “Поле имени” и “Поле типа значения” таблицы на закладке “Характеристики”. Для визуального выделения дополнительных реквизитов объекта в запросе по видам характеристик к наименованиям добавлен текст “(доп. реквизит)”.
В колонке “Источник значений” на вкладке “Характеристики” выберем вариант “Таблица”. В колонке “Значения характеристик” выберем “РегистрСведений.Характеристики”, в колонке “Поле объекта” – наименование измерения регистра “Объект”, в колонке “Поле вида” – наименование измерения “ВидХарактеристики”, а в колонке “Поле значения” – наименование ресурса “Значение”.

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

{ХАРАКТЕРИСТИКИ
ТИП(Справочник.Контрагенты)
ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ
ВидыХарактеристик.Ссылка,
ВидыХарактеристик.Наименование + " (доп. реквизит)" КАК Наименование,
ВидыХарактеристик.ТипЗначения
ИЗ
ПланВидовХарактеристик.ВидыХарактеристик КАК ВидыХарактеристик)
ПОЛЕКЛЮЧА Ссылка
ПОЛЕИМЕНИ Наименование
ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения
ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.Характеристики
ПОЛЕОБЪЕКТА Объект
ПОЛЕВИДА ВидХарактеристики
ПОЛЕЗНАЧЕНИЯ Значение }

Проверим работу отчёта. Для этого откроем отчёт “Ведомость взаиморасчетов (с характеристиками)”. Перейдем в пункт меню “Все действия -> Изменить вариант”. В окне настроек перейдём на закладку “Отбор” и добавим отбора по дополнительному реквизиту контрагента “Адрес”

Отбор по дополнительному реквизиту в отчёте

Отбор по дополнительному реквизиту в отчёте

Вариант №2

Рассмотрим более универсальный вариант работы с характеристикам объектов, благодаря которому характеристики возможно будет использовать в любых отчетах, содержащих объект-владелец характеристик, а также устанавливать отборы по значению этих характеристик в формах списков.
Перейдём на закладку “Данные” справочника “Контрагенты” и нажмём кнопку “Характеристики”.

Характеристики справочника "Контрагенты"

Характеристики справочника “Контрагенты”

В открывшемся окне “Дополнительных характеристик объекта метаданных” добавим строку. В колонке “Виды характеристик” выберем “ПланВидовХарактеристик.ВидыХарактеристик”, в колонке “Поле ключа” – “Ссылка”. В колонке “Значения характеристик” выберем “РегистрСведений.Характеристики”, в колонке “Поле объекта” – “Объект”, в колонке “Поле вида” – “ВидХарактеристики”, в колонке “Поле значения” – “Значение”. Сохраним конфигурацию и попробуем воспользоваться дополнительными характеристиками справочника “Контрагенты” в форме списка (в отчёте “Ведомость взаиморасчетов” использование дополнительных реквизитов будет выглядеть аналогичному тому как это было описано в Варианте №1, с той лишь разницей, что наименованию вида характеристики не будет добавляться текст “(доп. реквизит)”). Откроем список справочника “Контрагенты”, перейдем в пункт меню “Все действия -> Настройка списка” и установим отбор по дополнительному реквизиту “Адрес”.

Отбор справочника "Контрагенты" по дополнительному реквизиту

Отбор справочника “Контрагенты” по дополнительному реквизиту

Стоит отметить, что при использовании Варианта №1 в отчётах с использованием СКД отключается приведенный механизм платформы и используется описанный пользователем.

Скачать пример

]]>
http://world1c.ru/index.php/dopolnitelnye-rekvizity-s-pomoshhyu-plana-vidov-xarakteristik/feed/ 0
Программная корректировка движений документа http://world1c.ru/index.php/programmnaya-korrektirovka-dvizhenij-dokumenta/ http://world1c.ru/index.php/programmnaya-korrektirovka-dvizhenij-dokumenta/#comments Wed, 20 Mar 2013 11:44:26 +0000 admin http://world1c.ru/?p=317 В некоторых типовых конфигурациях фирмы 1С существует возможность ручной корректировки движений документа по регистрам. В конфигурации 1С: Бухгалтерия 8 для этого, при наличии соответствующих прав, нужно открыть движения документа и установить флаг “Ручная корректировка”. Однако, иногда возникает необходимость выполнить корректировку движений большого количества документов. В этом случае нам понадобится обработка, которая изменит движения документов без перепроведения.

Рассмотрим как изменить движения документа на примере конфигурации 1С: Бухгалтерия 8. Менять будем движения по регистру бухгалтерии “Хозрасчетный”. Пусть  перед нами стоит задача заполнить суммы налогового учета по данным бухгалтерского. Предположим, что у нас уже есть обработка, которая  выбирает необходимые нам документы и последовательно обрабатывает их с помощью описанной нами процедуры “ИзменитьДвиженияДокумента”. Посмотрим как должна выглядеть эта процедура.

Процедура ИзменитьДвиженияДокумента(ДокументСсылка)
	// прочитаем набор записей регистра по документу	
	НаборЗаписей = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
	НаборЗаписей.Отбор.Регистратор.Установить(ДокументСсылка);
	НаборЗаписей.Прочитать();    

	Если НаборЗаписей.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	// переберем все записи набора и заполним суммы по налоговому учету
	Для каждого Запись из НаборЗаписей Цикл
		// перед изменением сумм проверяем ведется ли налоговый учет на выбранном счёте
		Если Запись.СчетДт.НалоговыйУчет Тогда
			Запись.СуммаНУДт = Запись.Сумма;
		КонецЕсли;
		Если Запись.СчетКт.НалоговыйУчет Тогда
			Запись.СуммаНУКт = Запись.Сумма;
		КонецЕсли;
	КонецЦикла;
	// установим признак обмена данными
	НаборЗаписей.ОбменДанными.Загрузка = Истина;
	НаборЗаписей.Записать();
	// установим признак ручной корректировки документа,
	// предварительно установив признак обмена данными
	ДокументОбъект = ДокументСсылка.ПолучитьОбъект();
	ДокументОбъект.ОбменДанными.Загрузка = Истина;
	ДокументОбъект.РучнаяКорректировка   = Истина;
	ДокументОбъект.Записать(); 
КонецПроцедуры 

Хотелось бы отметить, что без проверки ведения налогового учета на счёте, при попытке записать набор, содержащий проводку с ненулевой суммой по счёту на котором не ведется налоговый учет, возникнет ошибка следующего содержания:

Запись не верна! Поле “Сумма (налоговый учет)” должно быть пустым! (Регистр бухгалтерии: Журнал проводок (бухгалтерский и налоговый учет); Номер строки: 1)

Режим обмена данными устанавливается следующими строками:

...
НаборЗаписей.ОбменДанными.Загрузка = Истина;
...
ДокументОбъект.ОбменДанными.Загрузка = Истина;
...

Это необходимо для того, чтобы не выполнялся программный код, находящийся в обработчиках событий “ПередЗаписью” модуля набора записей регистра бухгалтерии “Хозрасчетный” и модуля корректируемого документа. В каждом из них (для типовых конфигураций) есть проверка следующего вида:

Если ОбменДанными.Загрузка Тогда
    Возврат;
КонецЕсли;

Признак ручной корректировки документа (ДокументОбъект.РучнаяКорректировка = Истина) необходимо устанавливать для того, чтобы изменения сохранились при повторном проведении документа. При проведении такого документа в конфигурации 1С:Бухаглерия 8 выдается следующее сообщение:

Движения документа отредактированы вручную и не могут быть автоматически актуализированы.

]]>
http://world1c.ru/index.php/programmnaya-korrektirovka-dvizhenij-dokumenta/feed/ 5
Отчёт “Обороты счёта”. Вывод дополнительных данных http://world1c.ru/index.php/otchyot-oboroty-schyota-vyvod-dopolnitelnyx-dannyx/ http://world1c.ru/index.php/otchyot-oboroty-schyota-vyvod-dopolnitelnyx-dannyx/#comments Mon, 18 Mar 2013 05:51:04 +0000 admin http://world1c.ru/?p=308 Проблема с отчетом “Обороты счёта”, о которой пойдёт речь далее, воспроизводится на конфигурации 1С:Бухгалтерия 8 КОРП 2.0.44.13, версия платформы 8.2.17.153. Судя по всему та же проблема будет возникать и в других конфигурациях 1С:Бухгалтерии (например, в ПРОФ или Базовой). Будем рассматривать отчёт “Обороты счёта” на примере счёта 01.01 “Основные средства в организации”. При выборе данного счёта в настройках появляется возможность выбора дополнительных данных, таких как “Инвентарный номер”, “Местонахождение”, “МОЛ” и т.п.

Установим флаг напротив одного из таких полей (пусть это будет “Инвентарный номер”), выберем небольшой период и сформируем отчёт.

Не трудно заметить, что в результатах отчёта инвентарный номер (как и любые другие дополнительные данные) выводится только для тех основных средств по которым за выбранный период есть обороты, что является ошибкой. Мне удалось найти обсуждение данной проблемы на форуме 1С-разработчиков, начатое ещё в 2010 году. Однако, ошибка до сих пор не устранена и найти готовое решение мне тоже не удалось.

Попробуем самостоятельно разобраться в чём же дело. Откроем отчёт “Обороты счёта” в конфигураторе. В разделе “Макеты” откроем схему компоновки данных “ОсновнаяСхемаКомпоновкиДанных”. Как мы видим, на закладке “Наборы данных” присутствует несколько наборов данных. Основные данные отчёта (остатки и обороты по счетам) выбираются наборами данных “ОсновнойНаборДанных” и “Обороты”. Дополнительные данные выбираются наборами “ДанныеОС”, “ДанныеФизлица” и “ДанныеНМА”. За вывод инвентарных номеров основных средств отвечает набор данных “ДанныеОС”. Если рассматривать каждый из эти наборов данных в отдельности, то никакой ошибки мы не обнаружим. Ошибка допущена при установке связей между наборами данных на закладке “Связи наборов данных”. Как мы видим, “ОсновнойНаборДанных” связывается с набором данных “Обороты”, он же связывается с набором “ДанныеОС”. Но далее мы видим связывание наборов данных “Обороты” и “ДанныеОС” (каждый из которых уже учавствует в связях в качестве приемника), что и приводит к возникновению описанной проблемы. Интересно, что при попытке связать подобным образом три таблицы в конструкторе запросов, возникает ошибка “Противоричивая связь”. Похоже, что при разработке платформы возможность возникновения данной ситуации при связывании наборов данных не была учтена. В результате чего противоречивая связь набора “ОсновнойНаборДанных” с “ДанныеОС” (и другие подобные) системой просто игнорируются. Таким образом, при формировании отчёта “Обороты счёта” фактически выполняется только связь набора “ОсновнойНаборДанных” с набором данных “Обороты”, а набор данных “Обороты” в свою очередь связывается с “ДанныеОС” (аналогично для “ДанныеФизЛица”, “ДанныеНМА”), что и приводит к тому, что в результатах отчёта мы видим дополнительные данных только по тем основным средствам (физлицам, нематериальным активам) для которых за выбранный период есть обороты.

Теперь давайте подумаем как решить данную проблему. Если открыть набор данных “ОсновнойНаборДанных”, то мы увидим, что данные в него выбираются из таблицы “ХозрасчетныйОстаткиИОбороты”, а в набор данных “Обороты” – из таблицы “ХозрасчетныйОбороты”. Таким образом “ОсновнойНаборДанных” включает в себя данные, выбираемые набором “Обороты”, а следовательно достаточно связи наборов “ОсновнойНаборДанных” и “ДанныеОС”. Связь набора “Обороты” с набором “ДанныеОС” является лишней, её можно убрать не опасаясь того, что при формировании отчёта какая-то часть данных может быть потеряна. Ситуация, когда в наборе “Обороты” данные будут присутствовать, а в “ОсновнойНаборДанных” – нет, исключена. Аналогичным образом можно поступить с наборами “ДанныеФизЛица” и “ДанныеНМА”. После такого преобразования дополнительные данные будут выводиться в отчёт независимо от того есть ли по ним обороты за выбранный период.

]]>
http://world1c.ru/index.php/otchyot-oboroty-schyota-vyvod-dopolnitelnyx-dannyx/feed/ 10
Дополнительная вычисляемая колонка в табличной части http://world1c.ru/index.php/dopolnitelnaya-vychislyaemaya-kolonka-v-tablichnoj-chasti/ http://world1c.ru/index.php/dopolnitelnaya-vychislyaemaya-kolonka-v-tablichnoj-chasti/#comments Sat, 29 Dec 2012 07:54:28 +0000 admin http://world1c.ru/?p=269 Иногда возникает необходимость вывода в табличное поле документа (или любого другого объекта, имеющего табличную часть) дополнительных колонок с данными, которые не содержатся непосредственно в табличной части. Реализовать это на платформе 1С: Предприятие 8.1 или 8.2 в режиме обычного приложения (без использования управляемых форм) было достаточно просто, чего не скажешь об управляемых формах в 1С 8.2.

Реализация на платформе 1С: Предприятие 8.1

В начале коротко о том, как добавить дополнительную колонку в табличное поле на платформе 1С 8.1. Предположим, что у нас есть некий документ с табличной частью “Товары” (с колонками “Номенклатура” и “Количество”) и нам нужно вывести дополнительную колонку “Цена”, которая бы содержала данные реквизита “Цена” элементов справочника “Номенклатура”, выбранных в строках табличной части. Для этого нам достаточно добавить в форме документа новую колонку “Цена” в табличное поле, содержащее данные табличной части документа и написать следующий код в обработчике события “ПриПолученииДанных” этого табличного поля:

// обработчик события "ПриПолученииДанных" табличного поля "Товары"
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		Номенклатура = ОформлениеСтроки.ДанныеСтроки.Номенклатура;
		Если ЗначениеЗаполнено(Номенклатура) Тогда
			ОформлениеСтроки.Ячейки.Цена.ОтображатьТекст = Истина;
			ОформлениеСтроки.Ячейки.Цена.Текст = Формат(Номенклатура.Цена,"ЧЦ=15; ЧДЦ=2");
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Хочу обратить внимание на то, что строки табличного поля обрабатываются порциями, по мере прокрутки списка.

Реализация на платформе 1С: Предприятие 8.2

На платформе 8.2 с использованием управляемых форм решение данной задачи потребует бóльших усилий. Это связано с тем, что за счет своей клиент-серверной ориентированности в платформе 8.2 в управляемом режиме отсутствуют некоторые привычные возможности – например, у табличного поля отсутствуют обработчики событий “ПриПолученииДанных” и “ПриВыводеСтроки”, которые мы могли бы использовать для этих целей в 1С 8.1 или 8.2 в обычных формах.
Пусть в нашей конфигурации есть документ “ВводОстатковДолга” с табличной частью “Контрагенты” (с колонками “Контрагент” и “Сумма”). В свою очередь у справочника “Контрагенты” есть реквизит “ИНН”, значение которого необходимо выводить в строках табличного поля.
Откроем управляемую форму документа, добавим новую колонку “ИНН” реквизита “Контрагенты” и перенесём её на закладку “Элементы” (для отображения в форме).
Добавление колонки ИНН
Откроем палитру свойств поля “КонтрагентыКонтрагент” и добавим обработчик события “ПриИзменении”

// служебная функция получения значения реквизита объекта (выполняется на сервере)
&НаСервере
Функция ЗначениеРеквизита(Объект,ИмяРеквизита);
	Возврат Объект[ИмяРеквизита];
КонецФункции

// обработчик события "ПриИзменении" поля "Контрагент" в табличном поле "Контрагенты"
&НаКлиенте
Процедура КонтрагентыКонтрагентПриИзменении(Элемент)
	ТекДанные = Элементы.Контрагенты.ТекущиеДанные;
	ТекДанные.ИНН = ЗначениеРеквизита(ТекДанные.Контрагент,"ИНН");
КонецПроцедуры

Это обеспечит нам изменение значения поля “ИНН” при выборе контрагента в строке табличного поля.
Теперь необходимо предусмотреть заполнение колонки “ИНН” при открытии формы документа, а так же после записи и при чтении на сервере. Обновление данных после записи и при чтении на сервере необходимо в связи с тем, что иначе значения колонки “ИНН” будут очищаться каждый раз при возникновении этих событий. Для заполнения колонки “ИНН” опишем в модуле формы служебную серверную процедуру

// служебная процедура для заполнения колонки "ИНН" табличного поля "Контрагенты"
&НаСервере
Процедура ОбновитьДанныеКолонкиИНН()
	Запрос = Новый Запрос(
	"ВЫБРАТЬ РАЗРЕШЕННЫЕ
	|	Контрагенты.Ссылка КАК Контрагент,
	|	Контрагенты.ИНН
	|ИЗ
	|	Справочник.Контрагенты КАК Контрагенты
	|ГДЕ
	|	Контрагенты.Ссылка В(&СписокКонтрагентов)"
	);
	Запрос.УстановитьПараметр("СписокКонтрагентов",Объект.Контрагенты.Выгрузить().ВыгрузитьКолонку("Контрагент"));
	Выборка = Запрос.Выполнить().Выбрать();
	Для Каждого Стр Из Объект.Контрагенты Цикл
		Если Выборка.НайтиСледующий(Стр.Контрагент,"Контрагент") Тогда
			Стр.ИНН = Выборка.ИНН;
		Иначе
			Стр.ИНН = "";
		КонецЕсли;
	КонецЦикла;
КонецПроцедуры

Затем добавим в модуль формы документа обработчики событий “ПриОткрытии”, “ПриЧтенииНаСервере” и “ПослеЗаписиНаСервере”, в каждой из которых будем вызвать описанную ранее служебную процедуру “ОбновитьДанныеКолонкиИНН”

&НаСервере
Процедура ПриЧтенииНаСервере(ТекущийОбъект)
	ОбновитьДанныеКолонкиИНН();
КонецПроцедуры

&НаСервере
Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи)
	ОбновитьДанныеКолонкиИНН();
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	ОбновитьДанныеКолонкиИНН();
КонецПроцедуры

Всё готово. Можно посмотреть на результат.

Форма документа "Ввод остатков долга"
Скачать пример

]]>
http://world1c.ru/index.php/dopolnitelnaya-vychislyaemaya-kolonka-v-tablichnoj-chasti/feed/ 12
Ошибка “Недопустимая строка с указанием класса” http://world1c.ru/index.php/oshibka-nedopustimaya-stroka-s-ukazaniem-klassa/ http://world1c.ru/index.php/oshibka-nedopustimaya-stroka-s-ukazaniem-klassa/#comments Tue, 25 Dec 2012 10:37:02 +0000 admin http://world1c.ru/?p=250 На днях тестировал новый релиз платформы 1С: Предприятия 8.2.17.143. После теста я его удалил в связи с тем, что использую клиент-серверную версию платформы и для перехода на новый релиз необходимо также обновить и серверную часть, а этого пока нет в планах. После удаления запустил базу данных “1С: Бухгалтерия предприятия КОРП” и при старте получил сообщение “Недопустимая строка с указанием класса”.
Было ясно, что вышеуказанный текст выдаётся в виде сообщения, а не ошибки, в связи с тем, что выполняется некий код, заключенный в конструкцию “Попытка … Исключение”. Для поиска места возникновения исключения я запустил отладку конфигурации, предварительно установив флаг “Останавливаться по ошибке” в настройках отладки (пункт меню конфигуратора “Отладка – Останавливаться по ошибке…”). В результате чего выполнение было прервано в модуле обработки “Обновление конфигурации” на строке создания COM-объекта.
Попытка
    ComConnector = Новый COMОбъект(УправлениеСоединениямиИБ.ИмяCOMСоединителя());
    ПортКластераСерверов = ComConnector.RMngrPortDefault;
    ПортАгентаСервера = ComConnector.RAgentPortDefault;
Исключение
    Сообщить(КраткоеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Функия “ИмяCOMСоединителя()” модуля “УправлениеСоединениямиИБ” возвращает значение “v82.COMConnector”. Таким образом ошибка возникает при выполнении кода

ComConnector = Новый COMОбъект("v82.COMConnector");

Теперь ситуация начала проясняться. Дело в том, что при установке новой платформы выполняется регистрация COM-объекта, необходимого для выполнения установки внешнего соединения с информационными базами 1С:Предприятия 8 и администрирования кластера серверов. Для регистрации данного COM-объекта используется библиотека comcntr.dll из каталога соответствующей версии платформы (Например, C:\Program Files\1cv82\8.2.15.310\bin\comcntr.dll). Для того чтобы не возникало проблем с COM-объектом при откате на предыдущий релиз платформы необходимо повторно выполнить регистрацию. Самый простой способ – войти в Пуск -> Выполнить… и выполнить команду RegSvr32. Для регистрации COM-объекта платформы 1С: 8.2.15.310 строка команды будет выглядеть так:

regsvr32 “C:\Program Files\1cv82\8.2.15.310\bin\comcntr.dll”

ВАЖНО:

Командную строку необходимо обязательно запускать с правами администратора. Для этого необходимо либо быть авторизованным в Windows под пользователем с правами администратора, либо запустить cmd.exe (из папки Windows\System32) от имени такого пользователя.

]]>
http://world1c.ru/index.php/oshibka-nedopustimaya-stroka-s-ukazaniem-klassa/feed/ 10
Итоги по колонке динамического списка http://world1c.ru/index.php/itogi-po-kolonke-dinamicheskogo-spiska/ http://world1c.ru/index.php/itogi-po-kolonke-dinamicheskogo-spiska/#comments Tue, 18 Dec 2012 04:11:11 +0000 admin http://world1c.ru/?p=191

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

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

За основу для разработки возьмём демо-конфигурацию. Будем добавлять итог по колонке “Сумма долга” динамического списка в форме справочника “Контрагенты” “ФормаСпискаРабочийСтол”. Общая идея состоит в следующем:

  • Создадим пустую схему компоновки данных (далее “СКД”) с ресурсом “Сумма долга” для справочника “Контрагенты”.
  • Программно скопируем текст запроса из динамического списка в “СКД”
  • Программно перенесём отбор, установленный в форме списка в настройки СКД
  • Выведем результат компоновки данных в таблицу и отобразим данные на форме

На том как создать СКД подробно останавливаться не буду. Сделать это не сложно. Для этого достаточно добавить для справочника “Контрагенты” новый макет с типом “Схема компоновки данных”. В СКД добавить набора данных “Запрос” (назовём его “Основной”). Текст запроса должен быть, например, таким:

ВЫБРАТЬ
	1 КАК СуммаДолга

Вместо значения “1″ в тексте запроса может быть что угодно, этот текст всё равно будет заменён текстом запроса динамического списка. Затем необходимо перенести поле “СуммаДолга” из доступных полей в поля ресурсов на закладке “Ресурсы” (в поле “Выражение” должно быть “Сумма(СуммаДолга)”). И наконец перейдём на закладку “Настройки”, где добавим группировку по пустому полю (она будет называться “<Детальные записи>”) и перенесём поле “СуммаДолга” в выбранные поля.

Настройки СКД "Итоги списка контрагентов"

Теперь добавим в форму списка контрагентов “ФормаСпискаРабочийСтол” таблицу итогов с колонками “Сумма долга” и “Отбор”.

Таблица итогов динамического списка

На закладке “Команды” добавим команду “Пересчитать итоги” и разместим кнопку вызова этой команды в панель инструментов таблицы итогов. Ниже приведён текст модуля формы.


&НаСервере
Функция ИтогиСпискаКонтрагентов()
	СКД = Справочники.Контрагенты.ПолучитьМакет("ИтогиСпискаКонтрагентовСКД");
	// скопируем текст запроса из динамического списка
	ТекстЗапроса = Список.ТекстЗапроса;
	СКД.НаборыДанных.Основной.Запрос = ТекстЗапроса;

	// подготовим таблицу и процессор вывода результата СКД в таблицу
	Таб = Новый ТаблицаЗначений;	
	ПроцессорВыводаВТЗ = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;	
	ПроцессорВыводаВТЗ.УстановитьОбъект(Таб);	

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	КомпоновщикНастроек = Новый КомпоновщикНастроекКомпоновкиДанных;
	КомпоновщикНастроек.ЗагрузитьНастройки(СКД.НастройкиПоУмолчанию);

	// загрузим настройки из настроек динамического списка
	Для Каждого ЭлементОтбораГП Из Список.Отбор.Элементы Цикл
		ЭлементОтбораСКД = КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
		ЗаполнитьЗначенияСвойств(ЭлементОтбораСКД,ЭлементОтбораГП);
	КонецЦикла;	

	МакетКомпоновки = КомпоновщикМакета.Выполнить(СКД,КомпоновщикНастроек.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));

	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;	
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки);

	Таб = ПроцессорВыводаВТЗ.Вывести(ПроцессорКомпоновкиДанных);
	Если Таб.Количество() = 0 Тогда
		Возврат Неопределено;
	Иначе
		Таб.Колонки.Добавить("Отбор");
		ТекстОтбора = Строка(Список.Отбор);		
		Таб[0].Отбор = ?(ТекстОтбора = "","Отбор не задан",ТекстОтбора);
		СтруктураДанных = Новый Структура;
		Для Каждого Колонка Из Таб.Колонки Цикл
			СтруктураДанных.Вставить(Колонка.Имя,Таб[0][Колонка.Имя]);
		КонецЦикла;		
		Возврат СтруктураДанных;
	КонецЕсли;
КонецФункции

&НаКлиенте
Процедура ПересчитатьИтоги(Команда)
	СтрокаДанных = ИтогиСпискаКонтрагентов();
	ТаблицаИтогов.Очистить();
	Если СтрокаДанных <> Неопределено Тогда
		СтрокаИтогов = ТаблицаИтогов.Добавить();
		ЗаполнитьЗначенияСвойств(СтрокаИтогов,СтрокаДанных);
	КонецЕсли;
КонецПроцедуры

Для того чтобы проверить работу примера запустим конфигурацию, установим отбор в форме списка контрагентов на рабочем столе и нажмём на кнопку “Пересчитать итоги”.

Пересчет итогов динамического спискаТеперь, как и обещал, перечислю недостатки такого решения.

  • Необходимо нажимать кнопку “Пересчитать итоги” при любых изменениях в списке. Если отбор был изменён или изменилась сумма долга по контрагенту, то данные итогов перестают быть актуальными. Отследить изменения отбора невозможно – для этого нет подходящего обработчика событий.
  • Если вы воспользовались кнопкой “Найти” панели инструментов динамического списка, то в списке отобразятся только строки, соответствующие условию поиска, но при пересчёте итогов сумма не изменится, так как эти условия не являются отбором.

Скачать пример

]]>
http://world1c.ru/index.php/itogi-po-kolonke-dinamicheskogo-spiska/feed/ 3
Отчет на СКД. Базовые приемы разработки (часть 2) http://world1c.ru/index.php/otchet-na-skd-bazovye-priemy-razrabotki-chast-2/ http://world1c.ru/index.php/otchet-na-skd-bazovye-priemy-razrabotki-chast-2/#comments Wed, 21 Nov 2012 21:09:00 +0000 admin http://world1c.500mb.net/?p=12
В этой статье мы познакомимся с таким удобным инструментом разработки отчетов платформы 1С: Предприятие 8, как система компоновки данных (СКД). СКД позволяет разрабатывать гибкие (настраиваемые) отчеты с минимальными трудозатратами в кратчайшие сроки. Однако, если не знать всех тонкостей этого механизма, то легко допустить ошибку, которая приведет к тому, что отчет будет как минимум неудобен в использовании или, что ещё хуже, будет выдавать некорректные результаты.
Мы будем разрабатывать отчет “Ведомость взаиморасчетов” для демонстрационной конфигурации из моей прошлой статьи “Управляемое приложение. Базовые примеры разработки (часть 1)”. Отчет должен будет выводить данные об изменении состояния взаиморасчетов с контрагентами за выбранный период в разрезе организаций, контрагентов и документов, которыми были сделаны эти изменения. Схематически наш будущий отчет можно представить в виде следующей таблицы.
Организация\Контрагент\Документ Начальный долг Увеличение долга Уменьшение долга Конечный долг
ЗАО “Конфетпром” 500,00 300,00 200,00
   ООО “Леденец” 500,00 300,00 200,00
Документ №1 от 01.11.2012 300,00 300,00
Документ №2 от 02.11.2012 300,00 200,00 500,00
Документ №3 от 02.11.2012 500,00 300,00 200,00
Итого 500,00 300,00 200,00
Приступим к разработке. Добавим в дереве конфигурации новый отчет, введем название и нажмём на кнопку “Открыть схему компоновки”. При этом откроется конструктор макета схемы компоновки данных. Жмём кнопку “Готово”. На закладке “Наборы данных” добавляем новый набор данных “Запрос” (назовём его “Взаиморасчеты”). Вызовем конструктор запроса. Будем выбирать данные из таблицы итогов “ОстаткиИОбороты” регистра накопления “Взаиморасчеты” (это, так называемая, “виртуальная” таблица, предназначенная для хранения итогов и оборотов по ресурсам регистра для различных наборов измерений). Откроем таблицу параметров виртуальной таблицы, где установим значения параметра “Периодичность” равным “Авто” (это позволит выбирать данные из таблицы итогов регистра с разной периодичностью). В поле “Условие” внесём текст “Организация = &Организация” (для дальнейшей фильтрации отчета по выбранному значению параметра “&Организация”.  Определим набор полей, которые будем использовать в отчёте. Поле “ВзаиморасчетыОстаткиИОбороты.Регистратор” заменим на следующую конструкцию (далее будет ясно для чего).
ВЫБОР
    КОГДА ВзаиморасчетыОстаткиИОбороты.Регистратор = НЕОПРЕДЕЛЕНО
        ТОГДА NULL
    ИНАЧЕ ВзаиморасчетыОстаткиИОбороты.Регистратор
КОНЕЦ
Установим для этого поля наименование “Документ” на закладке “Объединения/Псевдонимы. На закладке “Дополнительно” установим флаг “Разрешенные” (тем самым в тексте запроса к предложению “ВЫБРАТЬ” будет добавлено ключевое слово “РАЗРЕШЕННЫЕ”). Это означает, что запрос выберет только те записи на которые у пользователя установлено право чтения. Так, если попытаться выбрать таким запросом данные без фильтра по организации под пользователем с правами на просмотр данных только одной организации, то будут выбраны данные только этой организации. Без использования ключевого слова “РАЗРЕШЕННЫЕ” в такой ситуации возникнет ошибка “Нарушение прав доступа”.
Особое внимание хотелось бы обратить на то, что кроме права “Чтение” для объектов, выбираемых отчетом, у пользователя должно быть установлено право “Просмотр”. В противном случае данные, связанные с этим объектом не будут выведены в отчёт без каких-либо сообщений об ошибке.

Завершим работу с конструктором запроса. В получившемся тексте запроса заменим строку “Оргаизация = &Оргаизация” на “{Организация = &Организация}”. Использование фигурных скобок в тексте запроса является расширением языка запросов для СКД (для обычных запросов такая возможность отсутствует). Заключенное в фигурные скобки условие в запросе схемы компоновки данных будет игнорироваться в случае, если хотя бы один из параметров, использованных в условии не задан.

Настройка полей схемы компоновки должна быть выполнена следующим образом.

Основные настройки уже сделаны платформой. Например, для полей периодов установлены необходимые настройки в колонке “Роль”. В качестве роли для этих полей установлен вариант “Период” и задан порядковый номер. Поля нумеруются в порядке возрастания, от наименьшего периода к наибольшему (это необходимо для правильного расчета остатков по полям периода в отчёте). Обратите внимание, что для поля “Документ” (Регистратор регистра накопления “Взаиморасчеты”) в колонке “Роль” тоже необходимо установить вариант “Период” и установить порядковый номер равным единице (порядковые номера остальных периодов необходимо увеличить на единицу). Как вы помните, ранее мы изменили поле “Документ” таким образом, что в ряде случаев оно может принимать значение “NULL”. Такое возможно, когда мы формируем отчет с детализацией до документов за период, на начало которого есть остатки. В таком случае мы получаем дополнительную строку начального остатка с “пустым” регистратором. Чтобы этого избежать мы установим в настройках роли поля “Документ” флаг “Игнорировать значения NULL”. Для полей остатков установлены соответствующие роли – начальный и конечный остаток. Это позволяет системе корректно выполнять расчет значений. В частности, итоги для полей остатков вычисляются ни как сумма всех строк таблицы, а как остаток по регистру.
Теперь перейдём на закладку “Ресурсы”. Здесь выберем поля, данные которых мы хотим видеть в итогах группировок и в общих итогах отчётаЗакладка "Ресурсы" отчета на СКДПерейдем на закладку “Параметры”. Здесь уже присутствуют предопределенные параметры “НачалоПериода” и “КонецПериода” (их значения будут использоваться в качестве параметров виртуальной таблицы “ОстаткиИОбороты” регистра “Взаиморасчеты”) и параметр “Организация”, который мы добавили в текст запроса вручную, заключив в фигурные скобки, чтобы он был необязательным. Закладка "Параметры" отчета на СКДДля удобства заполнения значений параметров “НачалоПериода” и “КонецПериода” добавим в список параметров “Период” с типом “СтандартныйПериод”. В поле “Выражение” для параметров “НачалоПериода” и “КонецПериода” внесём текст “&Период.ДатаНачала” и “&Период.ДатаОкончания” соответственно, а для самих параметров отключим флаги “Ограничение доступности”.
И наконец перейдём на закладку “Настройки”. На вложенной закладке “Параметры” для параметров “Организация” и “Период” установим флаг “Включать в пользовательские настройки” (он устанавливается в окне “Пользовательские настройки элемента” – правая кнопка мыши на параметре, пункт выпадающего меню “Свойства элемента пользовательских настроек”). Закладка "Настройки -> Параметры" отчета на СКДПосле выполнения данной настройки параметры будут отображаться в основой форме отчёта.
Откроем конструктор настроек компоновки данных. На первом шаге выберем тип отчета (пусть это будет “Таблица”), на втором – поля, которые хотим выводить в отчёт, а на третьем – настроим группировку строк. В результате получим следующую настройку компоновки.Настройки компоновки данныхОтчет готов. Посмотрим на результат.
Отчет "Ведомость взаиморасчетов"

]]>
http://world1c.ru/index.php/otchet-na-skd-bazovye-priemy-razrabotki-chast-2/feed/ 8
Управляемое приложение. Базовые приёмы разработки (часть 1) http://world1c.ru/index.php/upravlyaemoe-prilozhenie-bazovye-priemi-razrabotki-chast-1/ http://world1c.ru/index.php/upravlyaemoe-prilozhenie-bazovye-priemi-razrabotki-chast-1/#comments Fri, 09 Nov 2012 11:03:00 +0000 admin http://world1c.500mb.net/?p=13
С выходом платформы 1С:Предприятие 8.2 подход к разработке принципиально изменился. Это касается как интерфейса (появились “управляемые формы”, которые не “рисуются”, а описываются), так и разделения функциональности между клиентом и сервером. Подробнее об это можно узнать здесь. И хотя с момента выхода новой платформы уже и прошло достаточно много времени, начинающий разработчик, а иной раз и программист со стажем зачастую сталкивается с тем, что не знает с чего начать изучение её новых возможностей. В этой статье я приведу некоторые простые примеры, которые помогут начать знакомство с этими возможностями.
Начинать будем с самого простого, не углубляясь в тонкости клиент-серверного взаимодействия и другие сложные механизмы работы платформы. За основу для разработки возьмём конфигурацию из статьи “Ограничение доступа на уровне записей (RLS)” (скачать). В ней уже есть несколько справочников (Контрагенты, Организации и Пользователи).
Создадим документ “Корректировка долга” с реквизитами “Организация”, “Контрагент” и “Сумма”, который будет менять состояние взаиморасчетов с контрагентами (уменьшать или увеличивать долг контрагентов).
Документ “Корректировка долга” Регистр “Взаиморасчеты”

Создадим регистр накопления “Взаиморасчеты” с двумя измерениями (“Организация”, “Контрагент”) и одним ресурсом – “Сумма”. Выберем документ “Корректировка долга” в качестве регистратора для регистра “Взаиморасчеты”.

Регистр “Взаиморасчеты”

Опишем предопределенную процедуру “ОбработкаПроведения” документа “Корректировка долга”.

// обработка проведения документа "Корректировка долга"
Процедура ОбработкаПроведения(Отказ, Режим)
  Движения.Взаиморасчеты.Записывать = Истина;
  Движение = Движения.Взаиморасчеты.Добавить();
  Движение.ВидДвижения = ?(Сумма > 0,ВидДвиженияНакопления.Приход, ВидДвиженияНакопления.Расход);
  Движение.Период = Дата;
  Движение.Организация = Организация;
  Движение.Контрагент = Контрагент;
  Движение.Сумма = ?(Сумма > 0,Сумма,-Сумма);
КонецПроцедуры

Как видно из кода, документ будет выполнять по регистру “Взаиморасчеты” движения с видом “Приход” (увеличивать долг) в случае, если значение реквизита “Сумма” больше нуля, и движения с видом “Расход” (уменьшение долга) в случае отрицательного значения реквизита “Сумма”.

Стоит отметить, что нулевое значение суммы не возможно в силу наложенного на данный реквизит ограничения – свойство “Проверка заполнения” для него установлено в значение “Выдавать ошибку”. Аналогичные ограничения установлены и для других реквизитов документа “Корректировка долга”. Эта новая (по сравнению с предыдущими релизами платформы 1С) возможность позволяет сократить время разработки, избавив программиста от необходимости писать код проверки заполненности реквизитов документа. А вот как эта проверка выглядит в пользовательском режиме:
Работа свойства “Проверка заполнения”для реквизита “Сумма”

 

Приступим к разработке управляемой формы документа “Корректировка долга”. На закладке “Элементы” добавим группу “НомерДата”.
Форма документа “Корректировка долга”
Добавим в группу реквизиты “Номер” и “Дата” и изменим свойства группы на следующие: Группировка – Горизонтальная, Отображение – Нет, Отображать заголовок – нет. Ниже расположим реквизит “Организация”, а под ним группу “КонтрагентСумма” с реквизитами “Контрагент” и “Сумма” (свойства аналогичны свойствам группы “НомерДата”). Для реквизита “Сумма” установим значение свойства “Ширина” равным 10.
Установим связь между реквизитам “Организация” и “Контрагент”. Для этого воспользуемся свойствами “Связи параметров выбора” и “Параметры выбора” реквизита “Контрагент”. Они должны быть установлены следующим образом.
Свойства поля “Контрагент” формы документа “Корректировка долга”
В результате такой настройки, при заполнении реквизита “Контрагент” справочник будет открываться с установленным отбором по организации, выбранной в реквизите документа, а при очистке поля “Контрагент” поле “Организация” будет очищаться вместе с ним.
Далее перейдем на закладку “Командный интерфейс” и установим флаг “Видимость” в группе “Перейти” навигационной панели. Благодаря этому мы сможем переходить к движениям, выполненным документом “Корректировка долга” по регистру “Взаиморасчеты”, прямо из формы документа. Замечу, что по нажатию на гиперссылку рядом с флажком “Видимость” открывается окно настройки видимости по ролям. Таким образом, при желании мы можем снять видимость данного пункта для отдельных ролей.
Командный интерфейс формы документа “Корректировка долга”

Основная часть готова. Осталось навести немного красоты. Начнём с модификации командного интерфейса рабочего стола (правая кнопка мыши на корне конфигурации, пункт выпадающего меню “Открыть командный интерфейс рабочего стола”).

Командный интерфейс рабочего стола

Здесь мы переместим справочники “Организации” и “Контрагенты” из панели навигации “Обычное” в панель навигации “Важное”. Благодаря такой настройке эти справочники будут выделены жирным шрифтом и находится в верхней части левой панели рабочего стола.
В панели действий “Создать” установим флаги напротив пунктов “Контрагент: создать” и “Корректировка долга: создать”. Таким образом пользователь будет иметь возможность быстро добавлять новых контрагентов и документы корректировки долга из панели действий “Создать” в верхней части рабочего стола.

Навигационные панели рабочего стола

Теперь займёмся заполнением рабочего стола (правая кнопка мыши на корне конфигурации, пункт выпадающего меню “Рабочая область рабочего стола”). Сюда будем выводить документы “Корректировка долга”, сгруппированные по контрагентам, и список контрагентов с дополнительной колонкой “Сумма долга”. Для этого нам понадобится ещё по одной управляемой форме для каждого из этих объектов. С помощью конструктора форм создадим ещё одну форму списка для документа “Корректировка долга”. Откроем свойства реквизита “Список” на закладке “Реквизиты” окна редактирования формы. В палитре свойств перейдем по гиперссылке “Открыть” свойства “Настройка списка”.

Настройка динамического списка документов “Корректировка долга”

В открывшемся окне перейдем на вкладку “Группировка” и добавим группировку по полю “Контрагент”.

Настройка динамического списка документов “Корректировка долга”

Аналогичным образом создадим дополнительную форму списка для справочника “Контрагенты”. В свойствах динамического списка установим флаг “Произвольный запрос” и перейдём по гиперссылке “Открыть” свойства “Настройка списка”. В конструкторе запроса преобразуем текст следующим образом:

ВЫБРАТЬ
 СправочникКонтрагенты.Ссылка,
 СправочникКонтрагенты.ВерсияДанных,
 СправочникКонтрагенты.ПометкаУдаления,
 СправочникКонтрагенты.Предопределенный,
 СправочникКонтрагенты.Родитель,
 СправочникКонтрагенты.ЭтоГруппа,
 СправочникКонтрагенты.Код,
 СправочникКонтрагенты.Наименование,
 СправочникКонтрагенты.Организация,
 ЕСТЬNULL(ВзаиморасчетыОстатки.СуммаОстаток, 0) КАК СуммаДолга
ИЗ Справочник.Контрагенты КАК СправочникКонтрагенты
 ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Взаиморасчеты.Остатки КАК ВзаиморасчетыОстатки
 ПО СправочникКонтрагенты.Ссылка = ВзаиморасчетыОстатки.Контрагент
Вернемся к форме “Рабочая область рабочего стола”.  Выберем в качестве шаблона рабочего стола вариант “Две колонки одинаковой ширины”. В левую колонку добавим только что созданную форму списка документа “Корректировка долга”, а в правую – справочника “Контрагенты”.
Настройка рабочей области рабочего стола

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

В следующей статье мы разработаем отчет “Ведомость взаиморасчетов”

Скачать пример

 

]]>
http://world1c.ru/index.php/upravlyaemoe-prilozhenie-bazovye-priemi-razrabotki-chast-1/feed/ 6
Ограничение доступа на уровне записей (RLS) http://world1c.ru/index.php/ogranichenie-dostupa-na-urovne-zapisei/ http://world1c.ru/index.php/ogranichenie-dostupa-na-urovne-zapisei/#comments Mon, 05 Nov 2012 21:30:00 +0000 admin http://world1c.500mb.net/?p=14
Часто возникает необходимость в частичном ограничении доступа к данным. Например, когда пользователь должен видеть документы только своей организации. В таких случаях в 1С используется механизм ограничения доступа на уровне записей (так называемый, RLS – Record Level Securiy).
Для примера предположим, что перед нами стоит следующая задача. На предприятии ведется многофирменный учет и каждый контрагент и пользователь базы данных относится к определенной организации. Необходимо обеспечить доступ к справочнику “Контрагенты” таким образом, чтобы каждый пользователь мог просматривать, редактировать и добавлять контрагентов только своей организации.
Для решения задачи будем использовать платформу “1С:Предприятие 8.2″. Создадим новую конфигурацию в свойствах которой в качестве основного режима запуска будет выбран вариант “Управляемое приложение”.
Далее создадим справочник “Организации” и ещё два справочника – “Контрагенты” и “Пользователи” с реквизитом “Организация”. Кроме справочников нам понадобятся два параметра сеанса – “Организация” и “Пользователь” (соответствующих типов). Значения этих параметров устанавливаются при запуске сеанса работы с конфигурацией и хранятся до его завершения. Именно значения этих параметров мы и будем использовать при добавлении условий ограничения доступа на уровне записей.
Установка параметров сеанса выполняется в специальном модуле – “Модуль сеанса”
В этом модуле опишем предопределенную процедуру “УстановкаПараметровСеанса” в которой вызовем функцию заранее подготовленного общего модуля “ПолныеПрава”. Это необходимо в силу особенностей работы базы данных в режиме управляемого приложения, когда часть программного кода может выполняться только на стороне сервера (подробно на объяснении этих принципов в данной статье я останавливаться не буду).
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    ПолныеПрава.УстановитьПараметрыСеанса();
КонецПроцедуры
В свойствах модуля “ПолныеПрава” необходимо отметить флажки “Сервер”, “Вызов сервера” и “Привилегированный” (последнее означает, что процедуры и функций данного модуля будут выполнятся без контроля прав доступа). Текст модуля будет выглядеть так:
Функция ОпределитьТекущегоПользователя()
    ТекПользователь = Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя(),Истина);
    Возврат ТекПользователь;
КонецФункции

Процедура УстановитьПараметрыСеанса() Экспорт
    ТекущийПользователь = ОпределитьТекущегоПользователя();
    ТекущаяОрганизация = Справочники.Организации.ПустаяСсылка();
    Если ЗначениеЗаполнено(ТекущийПользователь) Тогда
        ТекущаяОрганизация = ТекущийПользователь.Организация;
    КонецЕсли;
    ПараметрыСеанса.Пользователь = ТекущийПользователь;
    ПараметрыСеанса.Организация = ТекущаяОрганизация;
КонецПроцедуры

Функция ПараметрСеансаУстановлен(ИмяПараметра) Экспорт
    Возврат ЗначениеЗаполнено(ПараметрыСеанса[ИмяПараметра]);
КонецФункции

Функция РольДоступнаПользователю(ИмяРоли) Экспорт
    Возврат РольДоступна(ИмяРоли);
КонецФункции
В модуле управляемого приложения будем проверять наличие пользователя конфигурации в справочнике “Пользователи” (для простоты будем искать его по наименованию) и завершать работу системы если он не найден. Это необходимо для того, чтобы обеспечить заполнение параметров сеанса.
Процедура ПередНачаломРаботыСистемы(Отказ)
    // всех кроме администратора будем проверять на наличие в справочнике "Пользователи"
    Если Не ПолныеПрава.РольДоступнаПользователю("ПолныеПрава") Тогда
        Если НЕ ПолныеПрава.ПараметрСеансаУстановлен("Пользователь") Тогда
            Предупреждение("Пользователь """ + ИмяПользователя() + """ не найден в справочнике!");
            Отказ = Истина;
            Возврат;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры
Теперь можем перейти непосредственно к описанию ограничений доступа. Для этого создадим роль “Пользователь” и перейдем на закладку “Шаблоны ограничений”, где добавим новый шаблон “КонтрагентыЧтениеИзменение” со следующим текстом шаблона:

ГДЕ Организация = &Организация #Параметр(1)
Текст шаблона ограничений является расширением языка запросов. В отличии от обычного запроса, текст ограничения должен в обязательном порядке содержать условие “ГДЕ”. В качестве значений параметров запроса (в нашем случае это “&Организация”) используются значения одноименных параметров сеанса. Конструкция вида #Параметр(1) означает, что на это место система подставит текст, переданный в качестве первого параметра в месте использования шаблона. С помощь приведенного шаблона будет выполняться проверка каждой записи таблицы (в нашем случае это будет справочник “Контрагены”). Для записей, значение реквизита “Организация” которых совпадает с заданным в соответствующем параметре сеанса, условие описанное в шаблоне будет выполняться. Таким образом эти записи будут доступны для чтения, изменения или добавления (в зависимости от того для какого из этих прав применяется шаблон). Продемонстрирую вышеизложенное на нашем примере.

Перейдем на закладку “Права” роли “Пользователь” и откроем список прав справочника “Контрагенты”. Будем использовать шаблон ограничений “КонтрагентыЧтениеИзменеие” для прав “Чтение”, “Изменение” и “Доблавление”.

Для права “Чтение” будем использовать шаблон с параметром “ИЛИ ЭтоГруппа”. При этом пользователям данной роли будет разрешено чтение не только элементов справочника “Контрагенты” своей организации, но и всех групп этого справочника.

#КонтрагентыЧтениеИзменение("ИЛИ ЭтоГруппа")
Поскольку при добавлении новых элементов справочника системой выполняется неявное чтение предопределенных реквизитов (это нужно, например, для нумерации), то необходимо обеспечить беспрепятственное чтение этих полей. Для этого добавим дополнительную строку с пустым текстом ограничения в таблицу ограничения доступа к данным и перечислим поля для которых действует данное правило – Ссылка, Версия данных, Родитель, Код.
Таким образом, поставленная задача ограничения доступа на уровне записей решена. Пользователи с действующими ограничениями получат доступ на просмотр и редактирование данных только своей организации.

Скачать пример

]]>
http://world1c.ru/index.php/ogranichenie-dostupa-na-urovne-zapisei/feed/ 4
Формирование отчетов в фоновом режиме http://world1c.ru/index.php/formirovanie-otchetov-v-fonovom-rezhime/ http://world1c.ru/index.php/formirovanie-otchetov-v-fonovom-rezhime/#comments Sat, 03 Nov 2012 11:35:00 +0000 admin http://world1c.500mb.net/?p=15

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

Для программного вывода отчета добавим в модуль формы следующую процедуру, которую будем вызывать при нажатии на кнопку “Сформировать”:

#НаКлиенте 
Процедура СформироватьОтчет() 
    // явное обращение к форме используется для наглядности 
    ЭтаФорма.СкомпоноватьРезультат();
КонецПроцедуры 

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

// пример вывода отчета с использованием фонового режима 
#НаКлиенте 
Процедура СформироватьОтчет()
    // явное обращение к форме используется для наглядности
    ЭтаФорма.СкомпоноватьРезультат(РежимКомпоновкиРезультата.Фоновый);
КонецПроцедуры 
]]>
http://world1c.ru/index.php/formirovanie-otchetov-v-fonovom-rezhime/feed/ 0