СКД не выводит поле в отчет Если в запросе используется конструкция вида регистратор.дата или получение еще какого-либо реквизита через регистратор и это поле не отображается в полях отчета СКД, то:
Допустим Вы сделали запрос по регистру накоплений и через регистратор обратились к дате или сумме документа и при формировании отчета СКД, эти поля недоступны !? как же быть?
Проблема в том - что у регистратором может выступать несколько документов и видимо права чтение/просмотр есть не на все - поэтому через скд эта таблица целиком недоступна, решение:
1. открыть доступ на все регистраторы регистра
2. в запросе четко обозначить тип
Код 1C v 8.3 //примеры
ВЫРАЗИТЬ(ДокументыОплаты.Регистратор КАК Документ.ПлатежноеПоручениеВходящее).СуммаДокумента
//или так
ВЫБОР
КОГДА РАЗНОСТЬДАТ(ВЫРАЗИТЬ(ВзаиморасчетыПоДокументам.ДокументРасчетовСКонтрагентом КАК Документ.ПоступлениеТоваровУслуг).Дата,КонецПериода, ДЕНЬ) > ВзаиморасчетыПоДокументам.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности
ТОГДА ДОБАВИТЬКДАТЕ(ВЫРАЗИТЬ(ВзаиморасчетыПоДокументам.ДокументРасчетовСКонтрагентом КАК Документ.ПоступлениеТоваровУслуг).Дата, ДЕНЬ, ВзаиморасчетыПоДокументам.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности)
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК ДеньВозникновенияЗадолженности
Возможные проблемы с правами доступа: Как сформировать отчет СКД без проверки прав (в привилегированном режиме)?
Схема работы СКД:
Категория:
Схема Компоновки Данных Как сформировать отчет СКД без проверки прав (в привилегированном режиме)? Что при разработке отчетов требуется чтобы у пользователя с ограниченными правами, отчет формировался полностью без проверки прав!
Особенно если настроен RLS
Есть несколько способов как это сделать: 1. Установить привилегированный режим в модуле отчета
Форма отчета должна быть Управляемой, далее в модуле отчета процедура обработчика «При компоновке результата»:
Код 1C v 8.3 //Перехватываем событие вывода компоновки данных в табличный документ и выводим со своим заголовком
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
УстановитьПривилегированныйРежим(Истина);
//Сформируем отчет
СформироватьОтчет(ДокументРезультат, ДанныеРасшифровки);
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
2. Формирование в п ривилегированном режиме через Общий модуль с галкой Привелигерованный
Создаем общий модуль
так же как в пункте 1 в обработчике «При компоновке результата» пишем:
Код 1C v 8.3 //Перехватываем событие вывода компоновки данных в табличный документ и выводим со своим заголовком
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
МЕ_ДляОтчетаСКД_ПривелРежим.СформироватьОтчетПривРеж(ДокументРезультат, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек);
КонецПроцедуры
В общем модуле МЕ_ДляОтчетаСКД_ПривелРежим код:
Код 1C v 8.3 Процедура СформироватьОтчетПривРеж(ТабличныйДокумент, СхемаКомпоновкиДанных, ДанныеРасшифровки, КомпоновщикНастроек) Экспорт
ТабличныйДокумент.Очистить();
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки,,,Ложь);
ВнешниеНаборыДанных = Новый Структура;
/// можно передать внешние данные ВнешниеНаборыДанных.Вставить("тзПродаж", СформироватьТЗПродаж());
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешниеНаборыДанных,ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(ТабличныйДокумент);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
КонецПроцедуры
3. Если включен режим Использовать ограничение на уровне прав доступа - RLS
Часто используется в типовых. Тут в модуле для текущего пользователя можно на время формирования отчету установить параметр сеанса ИспользоватьОграниченияПравДоступаНаУровнеЗаписей в Ложь и RLS не сработает.
Код 1C v 8.3 ПараметрыСеанса.ИспользоватьОграниченияПравДоступаНаУровнеЗаписей=Ложь;
После завершения формирования, не забудьте включить rls обратно установив = Истина
4. Если в запросе используется конструкция вида регистратор.дата и это поле не отображается в полях отчета СКД
Допустим Вы сделали запрос по регистру накоплений и через регистратор обратились к дате или сумме документа и при формировании отчета СКД, эти поля недоступны !? как же быть?
Проблема в том - что у регистратором может выступать несколько документов и видимо права чтение/просмотр есть не на все - поэтому через скд эта таблица целиком недоступна, решение:
1. открыть доступ на все регистраторы регистра
2. в запросе четко обозначить тип
Код 1C v 8.3 //примеры
ВЫРАЗИТЬ(ДокументыОплаты.Регистратор КАК Документ.ПлатежноеПоручениеВходящее).СуммаДокумента
//или так
ВЫБОР
КОГДА РАЗНОСТЬДАТ(ВЫРАЗИТЬ(ВзаиморасчетыПоДокументам.ДокументРасчетовСКонтрагентом КАК Документ.ПоступлениеТоваровУслуг).Дата,КонецПериода, ДЕНЬ) > ВзаиморасчетыПоДокументам.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности
ТОГДА ДОБАВИТЬКДАТЕ(ВЫРАЗИТЬ(ВзаиморасчетыПоДокументам.ДокументРасчетовСКонтрагентом КАК Документ.ПоступлениеТоваровУслуг).Дата, ДЕНЬ, ВзаиморасчетыПоДокументам.ДоговорКонтрагента.ДопустимоеЧислоДнейЗадолженности)
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК ДеньВозникновенияЗадолженности
В дополнении у пункту 1, код процедуры сформировать отчет(). Для вывода отчета я использую шаблон All4CF.ru_Template_SKD_v4.1 в нем уже реализованы почти все необходимые функции и работает в Обычных и УП формах:
Код 1C v 8.3 // Процедура выполняет формирование табличного документа по настройкам СКД
Процедура СформироватьОтчет(ТабличныйДокумент, ДанныеРасшифровки)
УстановитьПривилегированныйРежим(Истина);
// если отчет открывается по расшифровке, отбору, упорядочиванию,
// группировке или условному оформлению - восстановим настройки вывода заголовка,
// т.к., в переданных настройках при этом, вывод заголовка отключен
// для того, чтобы не выводился встроенный заголовок компоновки.
ВосстановитьНастройкиВыводаЗаголовка();
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ТабличныйДокумент.Очистить();
// установим обязательные настройки отчета
УстановитьПараметрыОтчета();
// Сделаем копию настроек вывода заголовка
СохранитьНастройкиВыводаЗаголовка();
ВыводитьЗаголовок = ВыводитьЗаголовокОтчета();
Если ВыводитьЗаголовок Тогда
ПрисоединитьЗаголовокОтчетаКТабличномуДокументу(ТабличныйДокумент, ПолучитьТекстЗаголовкаОтчета());
// Отключим в настройках вывод встроенного заголовка
НайденнаяНастройкаВыводаЗаголовка = КомпоновщикНастроек.Настройки.ПараметрыВывода.Элементы.Найти("ВыводитьЗаголовок");
НайденнаяНастройкаВыводаЗаголовка.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;
НайденнаяНастройкаВыводаЗаголовка.Использование = Истина;
КонецЕсли;
КопияДополнительныхНастроек = УстановитьДополнительныеНастройкиДляРасшифровки();
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, КомпоновщикНастроек.Настройки, ДанныеРасшифровки);
// при необходимости вставим внешние наборы данных в СКД
ВнешниеНаборыДанных = Новый Структура;
ТаблицаВнешнегоНабораДанных = ПолучитьТаблицуВнешнегоНабораДанных();
ВнешниеНаборыДанных.Вставить("ТаблицаВнешнегоНабораДанных",ТаблицаВнешнегоНабораДанных);
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных,ВнешниеНаборыДанных,ДанныеРасшифровки);
ВывестиРезультатКомпоновкиСАвтофиксациейСтрок(ТабличныйДокумент, ПроцессорКомпоновкиДанных, ДанныеРасшифровки.Элементы,,,КоличествоФиксируемыхСтолбцов);
ДополнительнаяОбработкаРезультатаОтчета(ТабличныйДокумент);
Если ВыводитьЗаголовок Тогда
// вернем настройки вывода заголовка на место
ВосстановитьНастройкиВыводаЗаголовка();
КонецЕсли;
// восстановим дополнительные настройки
Для Каждого ЭлементСтруктуры Из КопияДополнительныхНастроек Цикл
КомпоновщикНастроек.Настройки.ДополнительныеСвойства.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
КонецЦикла;
// сохраненные настройки нужны только при расшифровке и т.п.
// и не будуть давать изменить вывоз заголовка при обычном формировании.
ОчиститьСохраненныеНастройкиВыводаЗаголовка();
УстановитьВидимостьЗаголовкаОтчета(ТабличныйДокумент);
УстановитьВидимостьПараметровОтчета(ТабличныйДокумент);
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры // СформироватьОтчет()
Категория:
Схема Компоновки Данных Как изменять записи регистра накопления? Основной шаблон такой:
Код 1C v 8.х Набор = РегистрыНакопления.ВашРегистр.СоздатьНаборЗаписей();
Набор.Отбор.<НазваниеОтбора>.Установить(<ЗначениеОтбора>);
Набор.Прочитать();
Для Каждого ТекДвижение Из Набор Цикл
//Делаете с записями регистра то - что вам хочется
КонецЦикла;
Набор.Записать();
Реальный пример:
Код 1C v 8.х Процедура МодификацияЗаписейРегистраНакопления()
ВыбДок = Документы.ПоступлениеТоваровУслуг.Выбрать();
Если ВыбДок.Следующий() Тогда
Набор = РегистрыНакопления.НДСПредъявленный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ВыбДок.Ссылка);
Набор.Прочитать();
// Изменение существующих записей
Для Каждого Движение Из Набор Цикл
Движение.НДС = 0;
КонецЦикла;
// Добавление новых записей, если вдруг необходимо
Движение = Набор.ДобавитьРасход();
Движение.Сумма = 100;
Движение.Период = ТекущаяДата();
Движение = Набор.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Сумма = 300;
Движение.Период = ТекущаяДата();
// удаление существующих записей если надо
Набор.Удалить(0);
Набор.Записать(Истина);
КонецЕсли;
КонецПроцедуры
Категория:
Регистры накопления Зависание 1С при печати (предварительном просмотре) или при ПроверитьВывод() У одного пользователя 1С-ка начала умирать при печати (и предварительном просмотре) конкретной печатной формы.
Способы решения:
1. Обновить Платформу
2. Проверить доступность принтера по умолчанию
3. Сделать
очистку кэша пользователя .
4. Настройки печатных форм хранятся в базе данных в хранилище настроек и их тоже надо почистить. Поможет следующий код, который выполняется один раз из внешней обработки (в файлах):
Код 1C v 8.х // Автор кода Puk2
КлючНастройки = "";
КлючОбъекта = "Общее/НастройкиПечатиТабличногоДокумента/ПАРАМЕТРЫ_ПЕЧАТИ_ПоступлениеТоваровУслуг_М4";
Пользователь = "Админ Администратович Администраторов";
ХранилищеСистемныхНастроек.Удалить(КлючОбъекта, КлючНастройки, Пользователь);
Групповая обработка "Хранилище Настроек Чистка"
Автор:
sanfoto -
Скачивать файлы может только зарегистрированный пользователь! Категория:
Администрирование Программное использование универсальной обработки Выгрузка Загрузка Данных XML Для работы, необходимо взять
обработку "ВыгрузкаЗагрузкаДанныхXML" , которая находится в шаблоне "Конвертация данных".
Пример обработки(автор Misha Macklaud):
Скачивать файлы может только зарегистрированный пользователь!
а это ее код:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
ОбработкаОбмен = Обработки.ВыгрузкаЗагрузкаДанныхXML.Создать();
ОбработкаОбмен.Инициализация();
ОбработкаОбмен.ОбработанныхКонстант = 0;
ОбработкаОбмен.ОбработанныхНаборовЗаписей = 0;
//отметки выгрузки Документов
СписокОбъектовВыгрузки = Новый СписокЗначений;
СписокОбъектовВыгрузки.Добавить(Метаданные.Документы.РеализацияТоваровУслуг);
СписокОбъектовВыгрузки.Добавить(Метаданные.Документы.ПоступлениеТоваровУслуг);
СписокОбъектовВыгрузки.Добавить(Метаданные.Документы.ТребованиеНакладная);
Для й=0 По СписокОбъектовВыгрузки.Количество()-1 Цикл
СтрокаВыгрузки = ОбработкаОбмен.ДеревоМетаданных.Строки.Найти(СписокОбъектовВыгрузки[й].Значение,"ОбъектМД",Истина);
СтрокаВыгрузки.Выгружать=1;
ОбработкаОбмен.ОбработкаИзмененияСостоянияВыгружать(СтрокаВыгрузки);
//отбор
Построитель = ОбработкаОбмен.ПодготовитьПостроительДляВыгрузки(СтрокаВыгрузки);
СписокСсылокВыгрузки = Новый СписокЗначений;
Для Каждого СтрокаТабДокументы Из ТабДокументы Цикл
Если (СтрокаТабДокументы.Документ.Метаданные() = СписокОбъектовВыгрузки[й].Значение) И (СтрокаТабДокументы.ФлагВыгружать) Тогда
СписокСсылокВыгрузки.Добавить(СтрокаТабДокументы.Документ.Ссылка);
КонецЕсли;
КонецЦикла;
Отбор = Построитель.Отбор;
Отбор.Добавить("Ссылка","Ссылка");
Отбор[0].Использование = Истина;
Отбор[0].ВидСравнения = ВидСравнения.ВСписке;
Отбор[0].Значение = СписокСсылокВыгрузки;
СтрокаВыгрузки.НастройкиПостроителя = Построитель.ПолучитьНастройки();
СтрокаВыгрузки.ИспользоватьОтбор = Истина;
КонецЦикла;
//отметки ОТМЕНЫ выгрузки Документов
СписокОбъектовВыгрузки.Очистить();
// СписокОбъектовВыгрузки.Добавить(Метаданные.Документы.Заявка);
Для й=0 По СписокОбъектовВыгрузки.Количество()-1 Цикл
СтрокаВыгрузки = ОбработкаОбмен.ДеревоМетаданных.Строки.Найти(СписокОбъектовВыгрузки[й].Значение,"ОбъектМД",Истина);
СтрокаВыгрузки.ВыгружатьПриНеобходимости = 0;
ОбработкаОбмен.ОбработкаИзмененияСостоянияВыгружать(СтрокаВыгрузки);
КонецЦикла;
//отметки выгрузки Справочников
СписокОбъектовВыгрузки.Очистить();
СписокОбъектовВыгрузки.Добавить(Метаданные.Справочники.Номенклатура);
Для й=0 По СписокОбъектовВыгрузки.Количество()-1 Цикл
СтрокаВыгрузки = ОбработкаОбмен.ДеревоМетаданных.Строки.Найти(СписокОбъектовВыгрузки[й].Значение,"ОбъектМД",Истина);
СтрокаВыгрузки.Выгружать=1;
ОбработкаОбмен.ОбработкаИзмененияСостоянияВыгружать(СтрокаВыгрузки);
КонецЦикла;
ИмяФайлаЗагрузки = "D:\А-Б.xml";
ОбработкаОбмен.ВыполнитьЗагрузку(ИмяФайлаЗагрузки);
ИмяФайлаВыгрузки = "D:\Б-А.xml";
ОбработкаОбмен.ВыполнитьВыгрузку(ИмяФайлаВыгрузки);
КонецПроцедуры
Процедура ВыбПериодНажатие(Элемент)
НастройкаПериода = Новый НастройкаПериода;
НастройкаПериода.РедактироватьКакИнтервал = Истина;
НастройкаПериода.РедактироватьКакПериод = Истина;
НастройкаПериода.ВариантНастройки = ВариантНастройкиПериода.Период;
НастройкаПериода.УстановитьПериод(НачПериода, ?(КонПериода='0001-01-01', КонПериода, КонецДня(КонПериода)));
Если НастройкаПериода.Редактировать() Тогда
НачПериода = НастройкаПериода.ПолучитьДатуНачала();
КонПериода = НастройкаПериода.ПолучитьДатуОкончания();
КонецЕсли;
КонецПроцедуры
Процедура ПриОткрытии()
НачПериода = ТекущаяДата();
КонПериода = ТекущаяДата();
КонецПроцедуры
Процедура ЗаполнитьТабЧастьОбъектом(Запрос,ОбъектЗапроса,ТЗ)
Запрос.Текст = "ВЫБРАТЬ
| ОбъектЗапроса.Ссылка
|ИЗ
| Документ."+ОбъектЗапроса+" КАК ОбъектЗапроса
|ГДЕ
| ОбъектЗапроса.ПометкаУдаления = ЛОЖЬ И
| ОбъектЗапроса.Дата МЕЖДУ &ДатаНач И &ДатаКон";
Запрос.УстановитьПараметр("ДатаНач",НачалоДня(НачПериода));
Запрос.УстановитьПараметр("ДатаКон",КонецДня(КонПериода));
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Дата = Выборка.Ссылка.Дата;
НоваяСтрока.Документ = Выборка.Ссылка;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьНажатие(Элемент)
ТабДокументы.Очистить();
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Дата");
ТЗ.Колонки.Добавить("Документ");
Запрос = Новый Запрос;
Если флРеализация Тогда
ОбъектЗапроса = "РеализацияТоваровУслуг";
ЗаполнитьТабЧастьОбъектом(Запрос,ОбъектЗапроса,ТЗ);
КонецЕсли;
Если флПоступление Тогда
ОбъектЗапроса = "ПоступлениеТоваровУслуг";
ЗаполнитьТабЧастьОбъектом(Запрос,ОбъектЗапроса,ТЗ);
КонецЕсли;
Если флТребованиеНакладная Тогда
ОбъектЗапроса = "ТребованиеНакладная";
ЗаполнитьТабЧастьОбъектом(Запрос,ОбъектЗапроса,ТЗ);
КонецЕсли;
ТЗ.Сортировать("Дата");
Для Каждого Стр Из ТЗ Цикл
НоваяСтрока = ТабДокументы.Добавить();
НоваяСтрока.Документ = Стр.Документ;
НоваяСтрока.ФлагВыгружать = Истина;
КонецЦикла;
КонецПроцедуры
Категория:
Конвертация данных, Обмен, Перенос Условия сравнения и проверки в Запросах. Отбор не заполненного значения Как задать отбор по Типу документа?
Как указать условие для отбора не определенного значения?
Как в языке запросов 1С отобрать не заполненное значение?
Какое условие указать в запросе после ключевого слова «ГДЕ», когда нужно сделать отбор по не заполненным полям?
Код 1C v 8.х Запрос.Текст =
"ВЫБРАТЬ
| усЕдиницыХранения.Ссылка
|ИЗ
| Справочник.усЕдиницыХранения КАК усЕдиницыХранения"
// Пример 1. сравнение с не заполненным булевым значением:
|ГДЕ
| усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны = Ложь
// Пример 2. но если это булево определено, то лучше так: // условие на отрицательное булево:
|ГДЕ
| НЕ усЕдиницыХранения.РазрешитьОтборИзРезервнойЗоны
// Пример 3. выборка по условию не заполненного поля, имеющего тип "справочник конкретного типа"
|ГДЕ
| усЕдиницыХранения.АктивнаяОбластьОтбора = ЗНАЧЕНИЕ(Справочник.усОбластиОтбора.ПустаяСсылка)
// Пример 3а. выборка по условию не заполненного поля, имеющего тип "документ конкретного типа"
|ГДЕ
| НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент.ПустаяСсылка)
// Пример 3б. выборка по условию не заполненного поля, имеющего тип "документы разных типов" (составное поле)
|ГДЕ
| (НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент1.ПустаяСсылка)
| ИЛИ НашРегистрСведений.Документ = ЗНАЧЕНИЕ(Документ.НашДокумент2.ПустаяСсылка)
| ИЛИ ...(и т.д. - последовательно перечисляем условия для всех возможных типов этого составного поля))
// Пример 4. или наоборот, если нужно выбрать заполненное значение типа "строка", то поможет условие:
|ГДЕ
| усЕдиницыХранения.Наименование > """"
// Пример 5. если нужно выбрать документы конкретного типа, при составном типе данных, например в регистре "ВыполняемыеЗадания" ресурс "Задание" имеет составной тип, среди значений которого возможен документ "Отбор"
|ГДЕ
| ВЫРАЗИТЬ(РегистрСведенийВыполняемыеЗадания.Задание КАК Документ.Отбор) ССЫЛКА Документ.Отбор
// Пример 5а. Еще аналогичный пример, когда нужно выбрать документы конкретного типа
| ВЫБОР
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.ПоступлениеТоваровУслуг) ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ТОГДА ""ПоступлениеТоваровУслуг""
| КОГДА ВЫРАЗИТЬ(агСоответствиеДокументов.ДокументБУ КАК Документ.РеализацияТоваровУслуг) ССЫЛКА Документ.РеализацияТоваровУслуг
| ТОГДА ""РеализацияТоваровУслуг""
| ИНАЧЕ """"
| КОНЕЦ КАК ВидДокумента
// Пример 6. выбор по условию не определенного значения:
|ГДЕ
| СохраненныеНастройки.Пользователь = НЕОПРЕДЕЛЕНО
// Пример 7. выбор по виду движения "Приход" регистра накопления, "Расход" - аналогично):
|ГДЕ
| РегТоварыВРознице.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
// Пример 8. Как в запросе указать, что выполнять запрос не нужно (например, нужно программно в зависимости от какого-то
// условия вернуть пустой результат запроса -
// Запрос.Текст = СтрЗаменить(Запрос.Текст, "ГДЕ Док.Ссылка = &ДокументСсылка", "ГДЕ ЛОЖЬ");).
// Для этого достаточно добавить условие "Где Ложь".
// Кстати, независимо от объема запрашиваемых в выборке данных, такой запрос будет выполнен мгновенно.
|ГДЕ ЛОЖЬ
// Пример 9. Проверка на то, что результат выполнения запроса содержит данные:
Если НЕ Запрос.Выполнить().Пустой() Тогда
// Пример 10. выбор по условию не заполненной даты:
|ГДЕ
| тбСтроки.ДатаОтмены = ДАТАВРЕМЯ(1, 1, 1)
источник Категория:
Запросы Табличное поле ~ Колонка с Флажком для пометки необходимых документов Вопрос:
Есть ТЗ с типом Значения ДокументСписок.ПоступлениеТоваровУслуг. Мне необходимо добавить еще одну колонку, в котором пользователь сможет отмечать необходимые документы для дальнейшей обработки(флажок, поставил/снял галочку).
Ответ:
Код 1C v 8.х Перем СписокДокументовДляОбработки;
Процедура ТабличноеПоле1ПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ОформлениеСтроки.Ячейки.Флажок1.УстановитьФлажок(СписокДокументовДляОбработки.Получить(ОформлениеСтроки.ДанныеСтроки.Ссылка) <> Неопределено);
КонецЦикла;
КонецПроцедуры
Процедура ТабличноеПоле1ПередНачаломИзменения(Элемент, Отказ)
Если ЭлементыФормы.ТабличноеПоле1.ТекущаяКолонка.Имя = "Флажок1" Тогда
Отказ = Истина;
Ссылка = ЭлементыФормы.ТабличноеПоле1.ТекущиеДанные.Ссылка;
Если СписокДокументовДляОбработки.Получить(Ссылка) = Неопределено Тогда
СписокДокументовДляОбработки.Вставить(Ссылка, Ссылка);
Иначе
СписокДокументовДляОбработки.Удалить(Ссылка);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
СписокДокументовДляОбработки = Новый Соответствие;
Колонка = ЭлементыФормы.ТабличноеПоле1.Колонки.Вставить(0, "Флажок1");
Колонка.Имя = "Флажок1";
Колонка.Ширина = 3;
Колонка.Данные = "";
Колонка.ДанныеФлажка = "ПометкаУдаления";
Колонка.ИзменятьПозицию = Ложь;
Колонка.ИзменениеРазмера = ИзменениеРазмераКолонки.НеИзменять;
Колонка.ИзменятьВидимость = Ложь;
Колонка.ИзменятьНастройку = Ложь;
Колонка.РежимРедактирования = РежимРедактированияКолонки.Непосредственно;
Категория:
Работа с Формой (Диалог) и её элементами Реализация расшифровки в Системе Компоновки Данных. Продолжая свой цикл заметок про СКД, сегодня я хотел бы поподробнее остановиться на расшифровке.
В СКД расшифровка представляет собой всплывающее меню (по двойному клику на ячейке), содержащие доступные пользователю действия, такие как открытие ссылки на элемент, упорядочивание, группировка, оформление и пр. Здесь я приведу примеры решения наиболее распространенных задач, связанных с расшифровкой, таких как:
1. Ограничение доступных действий;
2. Добавление в меню своего произвольного действия;
3. Добавление в меню различных действий, в зависимости от ячейки, для которой выполняется расшифровка.
Вся работа с расшифровкой, выполняется в событии ОбработкаРасшифровки. Что бы получить доступ к этому событию, необходимо сначала сгенерировать основную форму отчета. Затем ПолеТабличногоДокумента > Свойства > События.
Итак, задача №1. Постановка:
Необходимо доступные действия для пользователя ограничить только: открытием элемента, упорядочиванием и оформлением.
Решение:
Код 1C v 8.х Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Перем ВыполненноеДействие;
СтандартнаяОбработка=Ложь;
ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
ДоступныеДействия=Новый Массив; // заполняем доступные действия, если параметр не указан, то будут доступны все действия
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Оформить);
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить);
Настройки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,ДоступныеДействия);
Если Настройки<>Неопределено Тогда // требуется сформировать отчет с новыми настройками
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); // загружаем настройки
ЭлементыФормы.Результат.Очистить(); // очищаем поле табличного документа
СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки); // выводим результат
КонецЕсли;
КонецПроцедуры
Задача №2. Постановка:
Необходимо добавить в меню свое действие, открывающее основную форму элемента, содержащегося в ячейке, для которой выполняется расшифровка.
Решение:
Код 1C v 8.х Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Перем ВыполненноеДействие;
СтандартнаяОбработка=Ложь;
ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
ДополнительныеДействия=Новый СписокЗначений;
ДополнительныеДействия.Добавить("Действие1","Дополнительное действие 1"); // добавляем свое действие
Настройки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,,ДополнительныеДействия);
Если Настройки<>Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
ЭлементыФормы.Результат.Очистить();
СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки);
Иначе
Если ВыполненноеДействие="Действие1" Тогда
ВыполнитьДействие1(Расшифровка); // процедура выполняемая при выборе пункта меню "Дополнительное действие 1"
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В процедуре ВыполнитьДействие1(Расшифровка) получаем ПараметрРасшифровки для выбранной ячейки и открывает основную форму:
Код 1C v 8.х Процедура ВыполнитьДействие1(Расшифровка)
Ссылка=ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Значение;
Ссылка.ПолучитьФорму().Открыть();
КонецПроцедуры
Задача №3. Постановка:
Необходимо в зависимости от колонки, для которой выполняется расшифровка, добавлять свои действия: для «Поле1» - «Действие1», для «Поле2» - «Действие2».
Решение:
Код 1C v 8.х Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Перем ВыполненноеДействие;
СтандартнаяОбработка=Ложь;
ОбработкаРасшифровки=Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки,Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));
ДополнительныеДействия=Новый СписокЗначений;
// Проверяем для какого поля выполняется расшифровка
Если ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле="Поле1" Тогда
ДополнительныеДействия.Добавить("Действие1","Дополнительное действие 1");
ИначеЕсли ДанныеРасшифровки.Элементы[Расшифровка].ПолучитьПоля()[0].Поле="Поле2" Тогда
ДополнительныеДействия.Добавить("Действие2","Дополнительное действие 2");
КонецЕсли;
Настройки=ОбработкаРасшифровки.Выполнить(Расшифровка,ВыполненноеДействие,,ДополнительныеДействия);
Если Настройки<>Неопределено Тогда
КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
ЭлементыФормы.Результат.Очистить();
СкомпоноватьРезультат(ЭлементыФормы.Результат,ДанныеРасшифровки);
Иначе
Если ВыполненноеДействие="Действие1" Тогда
ВыполнитьДействие1(Расшифровка);
ИначеЕсли ВыполненноеДействие="Действие2" Тогда
ВыполнитьДействие2(Расшифровка);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Как видите, ничего сложного здесь нет!
Источник
При использовании в типовой конфигурации:
Код 1C v 8.х // Чтобы добавить свою расшифровку в СКД нужно в Форме отчета.
// ЭлементФормы ПолеТаблчногоДокумента в событие ОбработкаРасшифровки поставить:
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если ДанныеРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля()[0].Поле = "ДокументОприходования" Тогда
Док = ДанныеРасшифровки.Элементы.Получить(Расшифровка).ПолучитьПоля().Найти("ДокументОприходования").Значение;
Если ТипЗнч(Док) = Тип("ДокументСсылка.ПоступлениеТоваровУслуг") Тогда
СтандартнаяОбработка = Ложь;
Предупреждение(Док.Комментарий);
Возврат;
КонецЕсли;
КонецЕсли;
ТиповыеОтчеты.СтандартнаяОбработкаРасшифровкиТиповогоОтчета(ОтчетОбъект, ЭтаФорма, Расшифровка, СтандартнаяОбработка);
КонецПроцедуры
Категория:
Схема Компоновки Данных Получить список документов и их табличные части в таблице значений Код 1C v 8.х Запрос=Новый Запрос;
Запрос.Текст="
|ВЫБРАТЬ
| ПоступлениеТоваровУслуг.Ссылка,
| ПоступлениеТоваровУслуг.Товары.(
| Номенклатура,
| Количество,
| Цена,
| Сумма
| )
|ИЗ
| Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
|ГДЕ
| ПоступлениеТоваровУслуг.Дата МЕЖДУ &ДатаН И &ДатаК
|";
Запрос.УстановитьПараметр("ДатаК",Дата("31.12.2010 0:00:00"));
Запрос.УстановитьПараметр("ДатаН",Дата("01.12.2010 0:00:00"));
Результат = Запрос.Выполнить();
Результат = Результат.Выбрать();
Пока Результат.Следующий() Цикл
///
КонецЦикла;
Категория:
Запросы Выгрузка результата запроса в текстовый файл с разделителями Код 1C v 8.х Запрос = Новый Запрос();
Запрос.УстановитьПараметр("ДатаНач",НачалоДня(ДатаНач));
Запрос.УстановитьПараметр("ДатаКон",КонецДня(ДатаКон));
Запрос.УстановитьПараметр("Организация",Организация);
Запрос.Текст = "ВЫБРАТЬ
| ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
| ПоступлениеТоваровУслугТовары.Количество КАК Количество,
| ПоступлениеТоваровУслугТовары.Цена КАК Цена,
| ПоступлениеТоваровУслугТовары.Ссылка.Номер КАК Номер,
| ПоступлениеТоваровУслугТовары.Ссылка.Дата КАК Дата,
| ПоступлениеТоваровУслугТовары.Ссылка.Контрагент КАК Контрагент,
| ПоступлениеТоваровУслугТовары.Номенклатура.Код КАК НоменклатураКод,
| ПоступлениеТоваровУслугТовары.Номенклатура.Артикул КАК НоменклатураАртикул
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
|ГДЕ
| ПоступлениеТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
| И ПоступлениеТоваровУслугТовары.Ссылка.Организация = &Организация
|
|УПОРЯДОЧИТЬ ПО
| Контрагент,
| Номер,
| Дата,
| НоменклатураКод,
| Номенклатура,
| НоменклатураАртикул,
| Количество,
| Цена";
Результат = Запрос.Выполнить().Выбрать();
Текст = Новый ЗаписьТекста("c:\vigruz.txt", КодировкаТекста.ANSI);
РезультатДок = Запрос.Выполнить().Выбрать();
Пока РезультатДок.Следующий() Цикл
ОбработкаПрерыванияПользователя();
// В качестве разделителей необходимо использовать Символы. ВК (CR),ВТаб (VTab),НПП (NBSp),ПС (LF),ПФ (FF),Таб (Tab)
//Если нам нужна строка вида " helpf.pro 07.08.2009 13 " в качестве разделителя используется табуляция
//то пишем так:
Текст.ЗаписатьСтроку(Строка(РезультатДок.Контрагент)+Символы.Таб+Строка(Формат((РезультатДок.Дата),"ДЛФ=D"))+Символы.Таб+Строка(РезультатДок.Номер));
// При загрузке строку можно будет разложить в массив для дальнейшей работы, РазложитьСтрокуВМассивПодстрок( ТекСтр, Символы.Таб). Ссылка на функцию ниже
//Если нужен вид
// helpf.pro
// 07.08.2009
// 13
// здесь в качестве разделителя используется перевод каретки (следующая строка), то пишем
Текст.ЗаписатьСтроку(РезультатДок.Контрагент);
Текст.ЗаписатьСтроку(Символы.ПС);
Текст.ЗаписатьСтроку(Формат((РезультатДок.Дата),"ДЛФ=D"));
Текст.ЗаписатьСтроку(Символы.ПС);
Текст.ЗаписатьСтроку(РезультатДок.Номер);
КонецЦикла;
Текст.Закрыть();
При загрузке для разбора строки используйте:
Функция разбирает строку на подстроки, используя заданный разделитель и возвращает массив
Еще посмотрите пример:
Загрузка данных из Текстового файла Категория:
Работа с Текстом (Строкой)