Публикации

БСП
Разработки

Найдено результатов: 27


Поле планировщика Иерархический список

Подбросьте пожалуйста простенький примерчик с программным оформлением иерархии в Поле планировщика. Типа Корпус №1 . . . Этаж 1 . . . . . . Комната 1 . . . . . . Комната 2 ... . . . . . . Комната N . . . Этаж 2 . . . . . . Комната 1 . . . . . . Комната 2 ....

СформироватьСписокПолучателейРассылки

Формирует список получателей из табличной части "Получатели" рассылки.
ОбщийМодуль.РассылкаОтчетов
Автор: 1С
// Формирует список получателей из табличной части "Получатели" рассылки.
//
// Параметры:
//   Рассылка - СправочникСсылка.РассылкиОтчетов, Структура - Элемент справочника, для которого необходимо сформировать
//              список получателей.
//
// Возвращаемое значение: 
//   Структура - Результат получения списка получателей рассылки.
//       * Получатели - Соответствие - Получатели. См. ВыполнитьРассылку(), описание к "ПараметрыДоставки.Получатели".
//       * Ошибки - Строка - Ошибки, которые возникли в процессе.
//
Функция СформироватьСписокПолучателейРассылки(ПараметрыЖурнала, Рассылка) Экспорт
	
	ВидКИ = Рассылка.ВидПочтовогоАдресаПолучателей;
	
	Если Рассылка.Личная Тогда
		
		РеквизитыТЧ = Метаданные.Справочники.РассылкиОтчетов.ТабличныеЧасти.Получатели.Реквизиты;
		
		ТипПолучателей = ТипЗнч(Рассылка.Автор);
		ТаблицаПолучателей = Новый ТаблицаЗначений;
		Для Каждого Реквизит Из РеквизитыТЧ Цикл
			ТаблицаПолучателей.Колонки.Добавить(Реквизит.Имя, Реквизит.Тип);
		КонецЦикла;
		ТаблицаПолучателей.Добавить().Получатель = Рассылка.Автор;
		
	Иначе
		
		ТипПолучателей = Рассылка.ТипПолучателейРассылки.КлючОбъектаМетаданных.Получить();
		ТаблицаПолучателей = Рассылка.Получатели.Выгрузить();
		
	КонецЕсли;
	
	СписокПолучателей = Новый Соответствие;
	
	Запрос = Новый Запрос;
	Если ТипПолучателей = Тип("СправочникСсылка.Пользователи") Тогда
	
		ТекстЗапроса =
		"ВЫБРАТЬ
		|	ТаблицаПолучателей.Получатель,
		|	ТаблицаПолучателей.Исключен
		|ПОМЕСТИТЬ втТаблицаПолучателей
		|ИЗ
		|	&ТаблицаПолучателей КАК ТаблицаПолучателей
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
		|	МАКСИМУМ(РассылкиОтчетовПолучатели.Исключен) КАК Исключен,
		|	СоставыГруппПользователей.Пользователь
		|ПОМЕСТИТЬ втПолучатели
		|ИЗ
		|	втТаблицаПолучателей КАК РассылкиОтчетовПолучатели
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.СоставыГруппПользователей КАК СоставыГруппПользователей
		|		ПО РассылкиОтчетовПолучатели.Получатель = СоставыГруппПользователей.ГруппаПользователей
		|			И (СоставыГруппПользователей.ГруппаПользователей.ПометкаУдаления = ЛОЖЬ)
		|ГДЕ
		|	СоставыГруппПользователей.Пользователь ССЫЛКА Справочник.Пользователи
		|	И СоставыГруппПользователей.Пользователь.ПометкаУдаления = ЛОЖЬ
		|	И СоставыГруппПользователей.Пользователь.Недействителен = ЛОЖЬ
		|	И СоставыГруппПользователей.Пользователь.Служебный = ЛОЖЬ
		|
		|СГРУППИРОВАТЬ ПО
		|	СоставыГруппПользователей.Пользователь
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
		|	втПолучатели.Пользователь КАК Получатель,
		|	тчКонтактнаяИнформация.Представление КАК EMail
		|ИЗ
		|	втПолучатели КАК втПолучатели
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК тчКонтактнаяИнформация
		|		ПО втПолучатели.Пользователь = тчКонтактнаяИнформация.Ссылка
		|ГДЕ
		|	втПолучатели.Исключен = ЛОЖЬ
		|	И тчКонтактнаяИнформация.Вид = &ВидКИ";
		
	Иначе
		
		ТекстЗапроса =
		"ВЫБРАТЬ
		|	ТаблицаПолучателей.Получатель,
		|	ТаблицаПолучателей.Исключен
		|ПОМЕСТИТЬ втТаблицаПолучателей
		|ИЗ
		|	&ТаблицаПолучателей КАК ТаблицаПолучателей
		|;
		|
		|////////////////////////////////////////////////////////////////////////////////
		|ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ
		|	СпрПолучателей.Ссылка КАК Получатель,
		|	тчКонтактнаяИнформация.Представление КАК EMail
		|ИЗ
		|	Справочник.Пользователи КАК СпрПолучателей
		|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Пользователи.КонтактнаяИнформация КАК тчКонтактнаяИнформация
		|		ПО (тчКонтактнаяИнформация.Ссылка = СпрПолучателей.Ссылка)
		|			И (тчКонтактнаяИнформация.Вид = &ВидКИ)
		|ГДЕ
		|	СпрПолучателей.Ссылка В ИЕРАРХИИ
		|			(ВЫБРАТЬ
		|				Получатели.Получатель
		|			ИЗ
		|				втТаблицаПолучателей КАК Получатели
		|			ГДЕ
		|				Получатели.Исключен = ЛОЖЬ)
		|	И (НЕ СпрПолучателей.Ссылка В ИЕРАРХИИ
		|				(ВЫБРАТЬ
		|					ИсключенияПолучателей.Получатель
		|				ИЗ
		|					втТаблицаПолучателей КАК ИсключенияПолучателей
		|				ГДЕ
		|					ИсключенияПолучателей.Исключен = ИСТИНА))
		|	И СпрПолучателей.ПометкаУдаления = ЛОЖЬ
		|	И &ЭтоНеГруппа";
		
		УстановитьПривилегированныйРежим(Истина);
		ПолучателиМД = Метаданные.НайтиПоТипу(ТипПолучателей);
		УстановитьПривилегированныйРежим(Ложь);
		
		Если Не ПолучателиМД.Иерархический Тогда
			// Не иерархический
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "В ИЕРАРХИИ", "В");
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", "");
		ИначеЕсли ПолучателиМД.ВидИерархии = Метаданные.СвойстваОбъектов.ВидИерархии.ИерархияЭлементов Тогда
			// Иерархия элементов
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", "");
		Иначе
			// Иерархия групп
			ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "И &ЭтоНеГруппа", "И СпрПолучателей.ЭтоГруппа = ЛОЖЬ");
		КонецЕсли;
		
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Справочник.Пользователи", ПолучателиМД.ПолноеИмя());
		
	КонецЕсли;
	
	Запрос.УстановитьПараметр("ТаблицаПолучателей", ТаблицаПолучателей);
	Если ЗначениеЗаполнено(ВидКИ) Тогда
		Запрос.УстановитьПараметр("ВидКИ", ВидКИ);
	Иначе
		ТекстЗапроса = СтрЗаменить(ТекстЗапроса, ".Вид = &ВидКИ", ".Тип = &ТипКИ");
		Запрос.УстановитьПараметр("ТипКИ", Перечисления.ТипыКонтактнойИнформации.АдресЭлектроннойПочты);
	КонецЕсли;
	Запрос.Текст = ТекстЗапроса;
	
	ТекстСообщенияОбОшибкеДляЖурналаРегистрации = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
		НСтр("ru = 'При формировании списка получателей ""%1"" возникла ошибка:'"), Строка(ТипПолучателей));
	
	// Механизм расширения
	Попытка
		СтандартнаяОбработка = Истина;
		РассылкаОтчетовПереопределяемый.ПередФормированиемСпискаПолучателейРассылки(Рассылка, Запрос, СтандартнаяОбработка, СписокПолучателей);
		Если СтандартнаяОбработка <> Истина Тогда
			Возврат СписокПолучателей;
		КонецЕсли;
	Исключение
		ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщенияОбОшибкеДляЖурналаРегистрации, ИнформацияОбОшибке());
		Возврат СписокПолучателей;
	КонецПопытки;
	
	// Стандартная обработка
	Попытка
		ТЗИтог = Запрос.Выполнить().Выгрузить();
	Исключение
		ЗаписьЖурнала(ПараметрыЖурнала,, ТекстСообщенияОбОшибкеДляЖурналаРегистрации, ИнформацияОбОшибке());
		Возврат СписокПолучателей;
	КонецПопытки;
	
	Для Каждого СтрИтог Из ТЗИтог Цикл
		Если Не ЗначениеЗаполнено(СтрИтог.EMail) Тогда
			Продолжить;
		КонецЕсли;
		
		ТекущийАдрес = СписокПолучателей.Получить(СтрИтог.Получатель);
		Если ТекущийАдрес = Неопределено Тогда
			ТекущийАдрес = "";
		Иначе
			ТекущийАдрес = ТекущийАдрес +"; ";
		КонецЕсли;
		ТекущийАдрес = ТекущийАдрес + СтрИтог.EMail;
		СписокПолучателей.Вставить(СтрИтог.Получатель, ТекущийАдрес);
	КонецЦикла;
	
	Если СписокПолучателей.Количество() = 0 Тогда
		ТекстОшибок = НСтр("ru = 'Не удалось сформировать список получателей %1 рассылки %2 по одной из возможных причин:
		| - У получателей не заполнен почтовый адрес %3;
		| - Не заполнен список получателей;
		| - Выбраны пустые группы получателей;
		| - Получатели помечены на удаление;
		| - Исключены все получатели (исключение имеет наивысший приоритет; участники исключенных групп также исключаются из списка);
		| - Недостаточно прав доступа к справочнику;
		| - Рекомендуется проверить корректность настройки учетной записи электронной почты, от имени которой выполняется рассылка.'");
		
		ЗаписьЖурнала(ПараметрыЖурнала, УровеньЖурналаРегистрации.Ошибка,
			СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(ТекстОшибок, "'"+ Строка(ТипПолучателей) +"'",
			"'"+ Строка(ПараметрыЖурнала.Данные) +"'", "'"+ Строка(ВидКИ) +"'"), "");
	КонецЕсли;
	
	Возврат СписокПолучателей;
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ПереместитьЭлемент

ОбщийМодуль.НастройкаПорядкаЭлементовСлужебный
Автор: 1С
Функция ПереместитьЭлемент(ЭлементСписок, ТекущийЭлементСсылка, Направление) Экспорт
	
	ПараметрыДоступа = ПараметрыДоступа("Изменение", ТекущийЭлементСсылка.Метаданные(), "Ссылка");
	Если Не ПараметрыДоступа.Доступность Тогда
		Возврат НСтр("ru = 'Недостаточно прав для изменения порядка элементов.'");
	КонецЕсли;
	
	Информация = НастройкаПорядкаЭлементов.ПолучитьИнформациюДляПеремещения(ТекущийЭлементСсылка.Метаданные());
	НастройкиКомпоновкиДанных = ЭлементСписок.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	
	// Для иерархических справочников может быть установлен отбор по родителю, если нет,
	// то способ отображения должен быть иерархический или в виде дерева.
	ОтображениеСписком = ЭлементСписок.Отображение = ОтображениеТаблицы.Список;
	Если Информация.ЕстьРодитель И ОтображениеСписком И Не СписокСодержитОтборПоРодителю(НастройкиКомпоновкиДанных) Тогда
		Возврат НСтр("ru = 'Для изменения порядка элементов необходимо установить режим просмотра ""Дерево"" или ""Иерархический список"".'");
	КонецЕсли;
	
	// Для подчиненных справочников должен быть установлен отбор по владельцу.
	Если Информация.ЕстьВладелец И Не СписокСодержитОтборПоВладельцу(НастройкиКомпоновкиДанных) Тогда
		Возврат НСтр("ru = 'Для изменения порядка элементов необходимо установить отбор по полю ""Владелец"".'");
	КонецЕсли;
	
	// Проверка признака "Использование" у реквизита РеквизитДопУпорядочивания по отношению к перемещаемому элементу.
	Если Информация.ЕстьГруппы Тогда
		ЭтоГруппа = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущийЭлементСсылка, "ЭтоГруппа");
		Если ЭтоГруппа И Не Информация.ДляГрупп Или Не ЭтоГруппа И Не Информация.ДляЭлементов Тогда
			Возврат НСтр("ru = 'Выбранный элемент нельзя перемещать.'");
		КонецЕсли;
	КонецЕсли;
	
	ПроверитьУпорядочиваниеЭлементов(ТекущийЭлементСсылка.Метаданные());
	
	НастройкиКомпоновкиДанных = ЭлементСписок.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	ТекстОшибки = ПроверитьСортировкуВСписке(НастройкиКомпоновкиДанных);
	Если Не ПустаяСтрока(ТекстОшибки) Тогда
		Возврат ТекстОшибки;
	КонецЕсли;
	
	ГруппировкаКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура[0];
	
	ПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных.Выбор.ДоступныеПоляВыбора.Элементы.Найти("Ссылка").Поле;
	ЕстьПолеСсылка = Ложь;
	Для Каждого ВыбранноеПолеКомпоновкиДанных Из ГруппировкаКомпоновкиДанных.Выбор.Элементы Цикл
		Если ВыбранноеПолеКомпоновкиДанных.Поле = ПолеКомпоновкиДанных Тогда
			ЕстьПолеСсылка = Истина;
			Прервать;
		КонецЕсли;
	КонецЦикла;
	Если Не ЕстьПолеСсылка Тогда
		ВыбранноеПолеКомпоновкиДанных = ГруппировкаКомпоновкиДанных.Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
		ВыбранноеПолеКомпоновкиДанных.Использование = Истина;
		ВыбранноеПолеКомпоновкиДанных.Поле = ПолеКомпоновкиДанных;
	КонецЕсли;
	
	СхемаКомпоновкиДанных = ЭлементСписок.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	ДеревоЗначений = ВыполнитьЗапрос(СхемаКомпоновкиДанных, НастройкиКомпоновкиДанных);
	Если ДеревоЗначений = Неопределено Тогда
		Возврат НСтр("ru = 'Для изменения порядка элементов необходимо сбросить настройки списка
			|(Меню Еще - Установить стандартные настройки).'");
	КонецЕсли;
	
	СтрокаДереваЗначений = ДеревоЗначений.Строки.Найти(ТекущийЭлементСсылка, "Ссылка", Истина);
	Родитель = СтрокаДереваЗначений.Родитель;
	Если Родитель = Неопределено Тогда
		Родитель = ДеревоЗначений;
	КонецЕсли;
	
	ИндексТекущего = Родитель.Строки.Индекс(СтрокаДереваЗначений);
	ИндексСоседнего = ИндексТекущего;
	Если Направление = "Вверх" Тогда
		Если ИндексТекущего > 0 Тогда
			ИндексСоседнего = ИндексТекущего - 1;
		КонецЕсли;
	Иначе // Вниз
		Если ИндексТекущего < Родитель.Строки.Количество() - 1 Тогда
			ИндексСоседнего = ИндексТекущего + 1;
		КонецЕсли;
	КонецЕсли;
	
	Если ИндексТекущего <> ИндексСоседнего Тогда
		СоседняяСтрока = Родитель.Строки.Получить(ИндексСоседнего);
		СоседнийЭлементСсылка = СоседняяСтрока.Ссылка;
		
		Элементы = Новый Массив;
		Элементы.Добавить(ТекущийЭлементСсылка);
		Элементы.Добавить(СоседнийЭлементСсылка);
		
		ПоменятьЭлементыМестами(ТекущийЭлементСсылка, СоседнийЭлементСсылка);
	КонецЕсли;
	
	Возврат "";
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

НаименованиеИАдресаЭлектроннойПочтыКонтакта

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Получить Реквизиты Объекта В Структуру

Возвращает значение или структуру с именами и значениями реквизитов произвольного объекта ссылочного типа прочитанные из информационной базы
// Возвращает значение или структуру с именами и значениями реквизитов произвольного объекта ссылочного типа
// прочитанные из информационной базы
//
// Параметры:
//  Ссылка - произвольный объект ссылочного типа (справочник, документ, план обмена, ПВХ, задача)
//  СтруктураРеквизитов - Необязательно. Может содержать значения:
//                      строка - имя реквизита объекта.
//                      строка - имена реквизитов, перечисленные через запятую, в формате требований к свойствам структуры.
//                      структура - структура с именами реквизитов.
//
//
// Возвращаемое значение:
//  Структура - если СтруктураРеквизитов имеет тип Структура и заполнен - структура с именами и значениями указанных реквизитов
//  Структура - если СтруктураРеквизитов не указан или не заполнен - структура с именами и значениями всех реквизитов объекта
//  Произвольный - если СтруктураРеквизитов строкового типа - значение данного реквизита
//
Функция ПолучитьРеквизитыОбъекта(Знач Ссылка, Знач СтруктураРеквизитов = Неопределено) Экспорт

    МетаданныеОбъекта = Ссылка.Метаданные();
    ИмяТаблицы = МетаданныеОбъекта.ПолноеИмя();

    ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка));
    ЭтоПланОбмена = ПланыОбмена.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка));
    ЭтоПВХ = ПланыВидовХарактеристик.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка));
    ЭтоПланВидовРасчета = ПланыВидовРасчета.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка));
    ЭтоДокумент = (Документы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)) ИЛИ БизнесПроцессы.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка)));
    ЭтоЗадача = Задачи.ТипВсеСсылки().СодержитТип(ТипЗнч(Ссылка));

    ТекстЗапроса = "ВЫБРАТЬ ";

    //Формируем список реквизитов объекта для запроса
    Если ТипЗнч(СтруктураРеквизитов) = Тип("Строка") И ЗначениеЗаполнено(СтруктураРеквизитов) Тогда

        ТекстЗапроса = ТекстЗапроса + СокрЛП(СтруктураРеквизитов);
        //Если передали список реквизитов, инициализируем структуру
        Если Найти(СтруктураРеквизитов, ",") <> 0 Тогда
            СтруктураРеквизитов = Новый Структура(СтруктураРеквизитов);
        КонецЕсли;

    ИначеЕсли ТипЗнч(СтруктураРеквизитов) = Тип("Структура") И СтруктураРеквизитов.Количество() > 0 Тогда

        Для каждого Реквизит Из СтруктураРеквизитов Цикл ТекстЗапроса = ТекстЗапроса + Реквизит.Ключ + ","; КонецЦикла;

        //Отрезаем последнюю запятую
        ТекстЗапроса = Лев(ТекстЗапроса, СтрДлина(ТекстЗапроса) - 1);

    Иначе

        //Определяем список реквизитов объектов для подстановки в текст запроса
        СписокРеквизитов = "";
        Если ЭтоСправочник ИЛИ ЭтоПланОбмена ИЛИ ЭтоПВХ ИЛИ ЭтоПланВидовРасчета Тогда
            Если МетаданныеОбъекта.ДлинаКода > 0 Тогда
                СписокРеквизитов = "Код,";
            КонецЕсли;
            Если МетаданныеОбъекта.ДлинаНаименования > 0 Тогда
                СписокРеквизитов = СписокРеквизитов + "Наименование,";
            КонецЕсли;
            Если ЭтоСправочник ИЛИ ЭтоПВХ Тогда
                Если МетаданныеОбъекта.Иерархический Тогда
                    СписокРеквизитов = СписокРеквизитов + "Родитель,";
                КонецЕсли;
                Если ЭтоСправочник И (МетаданныеОбъекта.Владельцы.Количество() <> 0) Тогда
                    СписокРеквизитов = СписокРеквизитов + "Владелец,";
                КонецЕсли;
            КонецЕсли;
        ИначеЕсли ЭтоДокумент Тогда
            Если МетаданныеОбъекта.ДлинаНомера > 0 Тогда
                СписокРеквизитов = "Номер,";
            КонецЕсли;
            СписокРеквизитов =  СписокРеквизитов + "Дата,";
        ИначеЕсли ЭтоЗадача Тогда
            Если МетаданныеОбъекта.ДлинаНомера > 0 Тогда
                СписокРеквизитов = "Номер,";
            КонецЕсли;
            СписокРеквизитов =  СписокРеквизитов + "Дата,";
            Если МетаданныеОбъекта.ДлинаНаименования > 0 Тогда
                СписокРеквизитов = СписокРеквизитов + "Наименование,";
            КонецЕсли;
        КонецЕсли;

        СписокРеквизитов = СписокРеквизитов + "ПометкаУдаления,";

        Для каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл СписокРеквизитов = СписокРеквизитов + Реквизит.Имя + ","; КонецЦикла;

        //Отрезаем последнюю запятую
        СписокРеквизитов = Лев(СписокРеквизитов, СтрДлина(СписокРеквизитов) - 1);
        СтруктураРеквизитов = Новый Структура(СписокРеквизитов);

        ТекстЗапроса = ТекстЗапроса + СписокРеквизитов;

    КонецЕсли;

    ТекстЗапроса = ТекстЗапроса + "
        |ИЗ " + ИмяТаблицы + "
        |ГДЕ Ссылка = &Ссылка";

    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
    Запрос.УстановитьПараметр("Ссылка", Ссылка);

    РезультатЗапроса = Запрос.Выполнить();
    Если НЕ РезультатЗапроса.Пустой() Тогда
        Выборка = РезультатЗапроса.Выбрать();
        Если Выборка.Следующий() Тогда
            Если ТипЗнч(СтруктураРеквизитов) = Тип("Строка") И ЗначениеЗаполнено(СтруктураРеквизитов) Тогда
                Возврат Выборка[СтруктураРеквизитов];
            Иначе
                ЗаполнитьЗначенияСвойств(СтруктураРеквизитов, Выборка);
				СтруктураРеквизитов.Вставить("Ссылка", Ссылка);//++
				Возврат СтруктураРеквизитов;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;

    Возврат Неопределено;

КонецФункции //ПолучитьРеквизитыОбъекта()

Обновить список документов - аналог кнопки F5

Автор: HostHost

FastCode 64 8
ОповеститьОбИзменении(Тип("ДокументСсылка.РаботаВВыходныеИПраздничныеДни"));

Программное добавление возможности отбора в динамический список формы

Автор: HostHost

FastCode 64 8
Если Не Пользователи.РолиДоступны("ИспользованиеДополнительныхРеквизитов") Тогда

        Форма.Список.ТекстЗапроса = Форма.Список.ТекстЗапроса + "

        |ГДЕ

        |       Документ.НужныйРеквизит = ЛОЖЬ";

КонецЕсли;

Структура подчиненности

Эта функция возвращает список документов в структуре подчиненности
Reloader 9 1
Функция ПолучитьРодительскиеДокументы(ДокументСсылка, СписокСвязанныхДокументов = Неопределено, мУжеВСписке = Неопределено) Экспорт
	Если СписокСвязанныхДокументов = Неопределено Тогда
		СписокСвязанныхДокументов = Новый СписокЗначений;
	КонецЕсли;
	Если мУжеВСписке = Неопределено Тогда
		мУжеВСписке = Новый Соответствие;
	КонецЕсли;
	МетаданныеДокумента = ДокументСсылка.Метаданные();
	СписокРеквизитов = Новый СписокЗначений;
	Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
		ТипыРеквизита = Реквизит.Тип.Типы();
		Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
			МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
			Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
				И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
				Попытка
					ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
				Исключение
					Прервать;
				КонецПопытки;
				ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
					И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
					Попытка
						СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
					Исключение
						ОтладкаТекстОшибки = ОписаниеОшибки();
					КонецПопытки;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
		СтрРеквизитов = "";
		Попытка
			СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
		Исключение
			Прервать;
		КонецПопытки;
		Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
			ТипыРеквизита = Реквизит.Тип.Типы();
			Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
				МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
				Если МетаданныеРеквизита<>Неопределено И Метаданные.Документы.Содержит(МетаданныеРеквизита)
					И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
					СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
					Прервать;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		СодержимоеТЧ.Свернуть(СтрРеквизитов);
		Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл
			Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл
				Попытка
					ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
				Исключение
					Продолжить;
				КонецПопытки;
				МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
				Если МетаданныеЗначения = Неопределено Тогда
					// базовый тип
					Продолжить;
				КонецЕсли;
				ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
					И Метаданные.Документы.Содержит(МетаданныеЗначения)
					И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
					Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
						Попытка
							СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
						Исключение
							ОтладкаТекстОшибки = ОписаниеОшибки();
						КонецПопытки;
					КонецЕсли;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
	КонецЦикла;
	мУжеВСписке.Вставить(ДокументСсылка, Истина);
	Для Каждого СтрСЗ Из СписокРеквизитов Цикл
		СписокСвязанныхДокументов = ПолучитьРодительскиеДокументы(СтрСЗ.Значение, СписокСвязанныхДокументов, мУжеВСписке);
	КонецЦикла;
	Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка
	| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
	Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
	Выборка = Запрос.Выполнить().Выбрать();
	ЕСли Выборка.Следующий() Тогда
		СписокСвязанныхДокументов.Добавить(Выборка.Ссылка);
	Иначе
		СписокСвязанныхДокументов.Добавить(ДокументСсылка);
	КонецЕсли;
	Возврат СписокСвязанныхДокументов;
КонецФункции
Функция ПолучитьПодчиненныеДокументы(ДокументСсылка, СписокСвязанныхДокументов = Неопределено, мУжеВСписке = Неопределено) Экспорт
	Если СписокСвязанныхДокументов = Неопределено Тогда
		СписокСвязанныхДокументов = Новый СписокЗначений;
	КонецЕсли;
	Если мУжеВСписке = Неопределено Тогда
		мУжеВСписке = Новый Соответствие;
	КонецЕсли;
	Таблица = ПолныеПрава.ПолучитьВыборкуПоКритериюОтбора("СвязанныеДокументы", ДокументСсылка);
	КэшПоТипамДокументов = Новый Соответствие;
	Для Каждого СтрокаТаблицы ИЗ Таблица Цикл
		МетаданныеДокумента = СтрокаТаблицы.Ссылка.Метаданные();
		Если Не ПравоДоступа("Чтение", МетаданныеДокумента) Тогда
			Продолжить;
		КонецЕсли;
		ИмяДокумента = МетаданныеДокумента.Имя;
		СинонимДокумента = МетаданныеДокумента.Синоним;
		СтруктураТипа = КэшПоТипамДокументов[ИмяДокумента];
		Если СтруктураТипа = Неопределено Тогда
			СтруктураТипа = Новый Структура("Синоним, МассивСсылок", СинонимДокумента, Новый Массив);
			КэшПоТипамДокументов.Вставить(ИмяДокумента, СтруктураТипа);
		КонецЕсли;
		СтруктураТипа.МассивСсылок.Добавить(СтрокаТаблицы.Ссылка);
	КонецЦикла;
	ЕСли КэшПоТипамДокументов.Количество() = 0 Тогда
		Возврат СписокСвязанныхДокументов;
	КонецЕсли;
	ТекстЗапросаНачало = "ВЫБРАТЬ РАЗРЕШЕННЫЕ * ИЗ (";
	ТекстЗапросаКонец = ") КАК ПодчиненныеДокументы ";
	Запрос = Новый Запрос;
	Для Каждого КлючИЗначение ИЗ КэшПоТипамДокументов Цикл
		Запрос.Текст = Запрос.Текст + ?(Запрос.Текст = "", "
		|ВЫБРАТЬ ", "
		|ОБЪЕДИНИТЬ ВСЕ
		|ВЫБРАТЬ") + "
		|Ссылка
		|ИЗ Документ." + КлючИЗначение.Ключ + "
		|ГДЕ Ссылка В (&" + КлючИЗначение.Ключ + ")";
		Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение.МассивСсылок);
	КонецЦикла;
	Запрос.Текст = ТекстЗапросаНачало + Запрос.Текст + ТекстЗапросаКонец;
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
			СписокСвязанныхДокументов.Добавить(Выборка.Ссылка);
			мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
			СписокСвязанныхДокументов = ПолучитьПодчиненныеДокументы(Выборка.Ссылка, СписокСвязанныхДокументов, мУжеВСписке);
		КонецЕсли;
	КонецЦикла;
	Возврат СписокСвязанныхДокументов;
КонецФункции

Чат бот ВКонтакте на 1С. Курс

Интенсив по разработке чат бота ВКонтакте. Используя API ВКонтакте создавать чат бот ВКонтакте из 1С. Получить список пользователей группы ВКонтакте и разослать им сообщения.
FastCode
Бесплатно

Получение данных динамического списка

Получить данные динамического списка с учетом отборов
Synoecium 14 1
	Схема = Элементы.Список.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
	Настройки = Элементы.Список.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема,Настройки,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
	ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	Результат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

Проверка совпадения таблиц.

Есть массив А из элементов некоторого справочника и есть справочник Б с табличной частью из элементов того же справочника. Найти элемент Б, где список точно совпадает с массивом А (ни больше ни меньше). На примере справочника "Контрагенты" (Как справочник Б). Приведенным далее запросом находятся контрагенты, у которых в табличной части имеются менеджеры из справочника "Пользователи" (Справочник А), список которых точно определен массивом &Массив. Требуется заранее определить размер массива и передать его в параметр &МассивКоличество.

Автор: ildarovich

FastCode 64 8
ВЫБРАТЬ
	Менеджеры.Ссылка
ИЗ
	Справочник.Контрагенты.МенеджерыПокупателя КАК Менеджеры

СГРУППИРОВАТЬ ПО
	Менеджеры.Ссылка

ИМЕЮЩИЕ
	КОЛИЧЕСТВО(*) = &МассивКоличество И
	МИНИМУМ(Менеджеры.МенеджерПокупателя В (&Массив)) = ИСТИНА

OneCIBasesCreator

Мини сервис по созданию файла со списком баз 1С (*v8i) на основании файла с настройками сервера (1CV8Clst.lst)
Бесплатно

Навигация

В поставке 12 скриптов для быстрой навигации (навигатор по метаданным, менеджер окон, улучшенные процедуры и функции, переход к определению по Ctrl+Click, каталог файлов, все подписки на события, ToDo навигатор, быстрый выбор типа данных, фильтр по главам Синтакс-помощника и др.
Бесплатно

TurboConf - расширение Конфигуратора 1С

TurboConf повышает эффективность работы в Конфигураторе 1С и помогает программисту автоматизировать свои задачи.
bolsun
5 000 руб.

Подсистема Журнал регистрации во внешней информационной базе 1С

Специальная подсистема для типовых и измененных конфигураций 1С платформы 8.2, 8.3, 8.4, которая фиксирует работу пользователей с информационной базой. С помощью подсистемы журнала можно мгновенно ответить на возникающие в повседневной работе вопросы: кто, когда и что изменил в 1С, а главное, что было до изменения и стало после него с расшифровкой по каждому реквизиту и табличной части. Восстанавливает при необходимости измененные объекты до первоначального состояния. Доступны отчеты по изменению объекта, динамика работы пользователей и т.д. Журнал фиксирует изменения не заметно для пользователей информационной базы, события подсистемы выгружаются и хранятся в отдельной информационной базе-хранителе.
15 000 руб.

Алкогольная декларация для 1С 8.1, 8.2, 8.3 (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 формы) УТ10.2/10.3, УТ11, УПП, КА, БП2.0/3.0, БП КОРП, Розница 1.0/2.1, Далион, Астор, УТАП и др. с подписью и шифрованием, редакция 2.3

Функциональный и надежный помощник по подготовке отчетности из 1С в ФС РАР
18 000 руб.

Обмен данными между 1С и ЕГАИС

Автоматический обмен данными с системой ЕГАИС из 1С: загрузка данных по контрагентам, производителям, алкогольной продукции, сопоставление данных и запись их в базу данных; загрузка ТТН и справок Б от поставщиков, отправка по ним актов; выгрузка ТТН покупателям; запрос остатков. Выгрузка производства, импорта, работа с торговым залом, помарочный учет. Запрос остатков и движения по справке Б, работа с марками и штрихкодами продукции. Запрос статуса ТТН, необработанных ТТН, отправка данных АСИиУ. Работа с актами расхождений и запросами на отмену актов.
10 500 руб.

Обмен с системой Меркурий через Web + Ветис.API для любых конфигураций (универсальная конфигурация Хамелеон Меркурий)

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий(тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше(достаточно снять галочку: свойства конфигурации и можно пользоваться всеми преимуществами из своей привычной учетной системы). Основное отличие от других решений - полностью открытый код, работа через веб-интерфейс и API 2.0. Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.
25 000 руб.

Управление IT-отделом 8

Готовое решение для ИТ-подразделений и аутсорсинговых компаний. Содержит полный комплекс средств для работы службы технической поддержки: программистов, системных администраторов, техников компьютерных сетей, эникейщиков и ИТ-руководителей. Конфигурация предназначена для ведения складского учета и учета по материальным лицам компьютерной техники и оборудования. Кроме этого учитывает ремонты, позволит заказывать оборудование и контролировать сроки поставок. Поможет в организации эффективной службы технической поддержки пользователей (Service Desk). Решение подходит как для небольшой организации, так и крупному холдингу. Конфигурация наведет порядок в учете, сэкономит время и станет незаменимым помощником в ИТ-структуре.
12 500 руб.

Выделенные строки

Работа с выделенными строками
ROXy 25 1 2
ВыделенныеСтроки = Элементы.Список.ВыделенныеСтроки; 
Сумма = 0; 
Для Каждого Строка Из ВыделенныеСтроки Цикл 
         Сумма = Сумма + Элементы.Список.ДанныеСтроки(Строка).Сумма; 
КонецЦикла;