Публикации

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

Скомпоновать результат отчета

Выполняет компоновку СКД по переданным настройкам
// Выполняет компоновку СКД по переданным настройкам
//
// Параметры:
//  Результат               - ТабличныйДокумент,ТаблицаЗначений,ДеревоЗначений                      - результат выполнения
//  СхемаКомпоновкиДанных   - СхемаКомпоновкиДанных                                                 - выполняемая СКД
//  НастройкиКомпоновки     - НастройкиКомпоновкиДанных,КомпоновщикНастроекКомпоновкиДанных,Строка  - выполняемые настройки или адрес временного хранилища или компоновщик с настройками
//  ДанныеРасшифровки       - ДанныеРасшифровкиКомпоновкиДанных, Неопределено                       - данные расшифровки
//  ВнешниеНаборыДанных     - Структура, Неопределено                                               - коллекция внешних наборов данных
//  ДополнительныеПараметры - Структура, Неопределено                                               - коллекция внешних наборов данных
//       * МакетОформления              - МакетОформленияКомпоновкиДанных   - Макет оформления, в соответствии с которым необходимо оформлять макет компоновки данных.
//       * ПроверятьДоступностьПолей    - Булево - Определяет, выполнять ли проверку прав на просмотр полей и проверку доступности поля во включенных функциональных возможностях.
//       * ПараметрыФункциональныхОпций - Булево - Содержит параметры функциональных опций, используемые при исполнении отчета.
//       * ВозможностьИспользованияВнешнихФункций - Булево - Указывает возможность использования функции общих модулей конфигурации в выражениях компоновки данных.
//
// SeiOkami: 
//     https://infostart.ru/profile/309462/
//     https://t.me/JuniorOneS
//Подробнее об использовании метода: https://infostart.ru/public/1082944/?ref=1159
//
Процедура СкомпоноватьРезультатОтчета(Результат, СхемаКомпоновкиДанных, НастройкиКомпоновки, 
    ДанныеРасшифровки = Неопределено, ВнешниеНаборыДанных = Неопределено, ДополнительныеПараметры = Неопределено) Экспорт
           
    
    //Инициализируем настройки
    Если ТипЗнч(НастройкиКомпоновки) = Тип("КомпоновщикНастроекКомпоновкиДанных") Тогда
        ВыполняемыеНастройки    = НастройкиКомпоновки.ПолучитьНастройки();
    ИначеЕсли ТипЗнч(НастройкиКомпоновки) = Тип("Строка") И ЭтоАдресВременногоХранилища(НастройкиКомпоновки) Тогда
        ВыполняемыеНастройки    = ПолучитьИзВременногоХранилища(НастройкиКомпоновки);
    Иначе 
        ВыполняемыеНастройки    = НастройкиКомпоновки;   
    КонецЕсли;
    
    Если НЕ ТипЗнч(ВыполняемыеНастройки) = Тип("НастройкиКомпоновкиДанных") Тогда
        Возврат;
    КонецЕсли;
    

    //Инициализируем дополнительные параметры вывода
    ПараметрыВывода    = Новый Структура;
    ПараметрыВывода.Вставить("МакетОформления"                        , Неопределено);
    ПараметрыВывода.Вставить("ПроверятьДоступностьПолей"              , Истина);
    ПараметрыВывода.Вставить("ПараметрыФункциональныхОпций"           , Новый Структура);
    ПараметрыВывода.Вставить("ВозможностьИспользованияВнешнихФункций" , Ложь);
    
    Если НЕ ДополнительныеПараметры = Неопределено Тогда
        ЗаполнитьЗначенияСвойств(ПараметрыВывода, ДополнительныеПараметры);
    КонецЕсли;
    
    //Определяем тип генератора
    Если ТипЗнч(Результат) = Тип("ТаблицаЗначений") ИЛИ ТипЗнч(Результат) = Тип("ДеревоЗначений") Тогда
        ВыводВКоллекциюЗначений = Истина;
        ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений");
    Иначе
        ВыводВКоллекциюЗначений = Ложь;
        ТипГенератораВывода     = Тип("ГенераторМакетаКомпоновкиДанных");
    КонецЕсли;
    
    //Формируем макет, с помощью компоновщика макета
    КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
    
    //Передаем в макет компоновки схему, настройки и данные расшифровки
    МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, ВыполняемыеНастройки, 
    ДанныеРасшифровки, ПараметрыВывода.МакетОформления, ТипГенератораВывода, 
    ПараметрыВывода.ПроверятьДоступностьПолей, ПараметрыВывода.ПараметрыФункциональныхОпций);
    
    //Выполним компоновку с помощью процессора компоновки
    ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
    ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ВнешниеНаборыДанных, 
    ДанныеРасшифровки, ПараметрыВывода.ВозможностьИспользованияВнешнихФункций);
    
    //Выводим результат
    Если ВыводВКоллекциюЗначений Тогда
        ПроцессорВывода    = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
        ПроцессорВывода.УстановитьОбъект(Результат);
    Иначе
        ПроцессорВывода    = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
        ПроцессорВывода.УстановитьДокумент(Результат);
    КонецЕсли;
    
    ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

КонецПроцедуры

Преобразовать массив структур в ТаблицуЗначений

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

FastCode Professional - быстрый поиск кода 1С Промо

Удобный поиск по базе шаблонов кода, БСП, общим модулям конфигурации и локальным файлам, ответы на вопросы, помощь сообщества программистов 1С. Клиент для поиска прямо в Конфигураторе!
-10%

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

Отправить сообщение или табличный документ в телеграм
FOX 14 2
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/// The MIT License
/// 
/// Copyright (c) 2019 Plague Fox
/// 
/// Permission is hereby granted, free of charge, to any person obtaining a copy
/// of this software and associated documentation files (the "Software"), to deal
/// in the Software without restriction, including without limitation the rights
/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
/// copies of the Software, and to permit persons to whom the Software is
/// furnished to do so, subject to the following conditions:
/// 
/// The above copyright notice and this permission notice shall be included in
/// all copies or substantial portions of the Software.
/// 
/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
/// THE SOFTWARE.
/// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Перем Токен,ИдентификаторПолучателя; // Телеграм
Перем ПроксиПротокол,ПроксиСервер,ПроксиПорт,ПроксиПользователь,ПроксиПароль; // Прокси

Процедура ОтправитьСообщениеВТелеграм(Сообщение)
    // Глобальные переменные в процедуре:
    // + Токен
    // + ИдентификаторПолучателя
    
    // Сформировать соединение и запрос
    Соединение  = ПолучитьСоединение();
    Адрес       = СтрШаблон("/bot%1/sendMessage?chat_id=%2&parse_mode=HTML&text=%3"
                , Токен
                , ИдентификаторПолучателя
                , КодироватьСтроку(Сообщение, СпособКодированияСтроки.КодировкаURL, "UTF8"));
    Заголовки   = Новый Соответствие;
    Запрос      = Новый HTTPЗапрос(Адрес, Заголовки);
    
    // GET
    Ответ       = Соединение.Получить(Запрос);
    
    // Разбор ответа
    Если Ответ.КодСостояния <> 200 Тогда
        ОтветСтрокой    = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        ВызватьИсключение СтрШаблон("Ошибка отправки вложения в телеграм.
            |Код состояния: %1
            |Тело: %2"
            , Ответ.КодСостояния
            , ОтветСтрокой
        ); 
    КонецЕсли;  
КонецПроцедуры // ОтправитьСообщениеВТелеграм()
//************************************************************
Процедура ОтправитьТабличныйДокументВТелеграм(ТабличныйДокумент, ИмяФайла = "", Сообщение = "")
    // Глобальные переменные в процедуре:
    // + Токен
    // + ИдентификаторПолучателя
    
    // Сформировать тело запроса
    Разделитель     = Строка(Новый УникальныйИдентификатор());
    
    // Формируем основное составное сообщение
    Тело            = Новый ПотокВПамяти();
    ЗаписьДанных    = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, Символы.ВК + Символы.ПС, Символы.ПС, Истина);
    
    // chat_id
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""chat_id""");
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку(ИдентификаторПолучателя);
    
    // disable_notification
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""disable_notification""");
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку("True");
        
    Если Не ПустаяСтрока(Сообщение) Тогда 
        // caption
        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""caption""");
        ЗаписьДанных.ЗаписатьСтроку("");
        ЗаписьДанных.ЗаписатьСтроку(Сообщение);        
        
        // parse_mode
        ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
        ЗаписьДанных.ЗаписатьСтроку("Content-Disposition: form-data; name=""parse_mode""");
        ЗаписьДанных.ЗаписатьСтроку("");
        ЗаписьДанных.ЗаписатьСтроку("HTML");
    КонецЕсли;
    
    // document    
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель);
    ЗаписьДанных.ЗаписатьСтроку(СтрШаблон("Content-Disposition: form-data; name=""document""; filename=""%1.pdf""", ?(ПустаяСтрока(ИмяФайла), "document_" + Строка(Новый УникальныйИдентификатор()), ИмяФайла)));
    ЗаписьДанных.ЗаписатьСтроку("Content-Type: application/pdf");
    ЗаписьДанных.ЗаписатьСтроку("");   
    ЗаписьДанных.Закрыть();    
    
    // Добавим файл
    ТабличныйДокумент.Записать(Тело, ТипФайлаТабличногоДокумента.PDF);
    
    // Завершение записи
    ЗаписьДанных    = Новый ЗаписьДанных(Тело, КодировкаТекста.UTF8, ПорядокБайтов.LittleEndian, Символы.ВК + Символы.ПС, Символы.ПС, Ложь);
    ЗаписьДанных.ЗаписатьСтроку("");
    ЗаписьДанных.ЗаписатьСтроку("--" + Разделитель + "--");
    ЗаписьДанных.Закрыть();
    
    ДанныеТела          = Тело.ЗакрытьИПолучитьДвоичныеДанные();   

    // Сформировать соединение и запрос
    Соединение  = ПолучитьСоединение();
    Заголовки   = Новый Соответствие;
    Заголовки.Вставить("Content-Type",      "multipart/form-data; boundary=" + Разделитель);
    Заголовки.Вставить("Accept",            "*/*");
    Заголовки.Вставить("Cache-Control",     "no-cache");
    Заголовки.Вставить("Host",              "api.telegram.org");
    Заголовки.Вставить("Accept-Encoding",   "gzip, deflate");
    Заголовки.Вставить("Content-Length",    Формат(ДанныеТела.Размер(), "ЧДЦ=0; ЧН=0; ЧГ=0"));
    Заголовки.Вставить("Connection",        "close");
    Адрес       = СтрШаблон("/bot%1/sendDocument", Токен);
    Запрос      = Новый HTTPЗапрос(Адрес, Заголовки);
    Запрос.УстановитьТелоИзДвоичныхДанных(ДанныеТела);

    // POST
    Ответ       = Соединение.ОтправитьДляОбработки(Запрос);

    // Разбор ответа
    Если Ответ.КодСостояния <> 200 Тогда
        ОтветСтрокой    = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
        ВызватьИсключение СтрШаблон("Ошибка отправки вложения в телеграм.
            |Код состояния: %1
            |Тело: %2"
            , Ответ.КодСостояния
            , ОтветСтрокой
        ); 
    КонецЕсли;
КонецПроцедуры // ОтправитьТабличныйДокументВТелеграм()
//************************************************************
Функция ПолучитьСоединение()    
    // Глобальные переменные в процедуре:
    // + ПроксиПротокол
    // + ПроксиСервер
    // + ПроксиПорт
    // + ПроксиПользователь
    // + ПроксиПароль
    
    Прокси      = Новый ИнтернетПрокси(Истина);
    Если ТипЗнч(ПроксиПротокол) = Тип("Строка") И Не ПустаяСтрока(ПроксиПротокол) Тогда
        Прокси.Установить(ПроксиПротокол, ПроксиСервер, ПроксиПорт, ПроксиПользователь, ПроксиПароль, Ложь);
    КонецЕсли;
    SSL         = Новый ЗащищенноеСоединениеOpenSSL();
    Соединение  = Новый HTTPСоединение("api.telegram.org", 443,,, Прокси, 30, SSL, Ложь); 
    Возврат Соединение;
КонецФункции // ПолучитьСоединение()

// ТЕЛЕГРАМ +
Токен                   = ""; // 000000000:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ИдентификаторПолучателя = ""; // -000000000
// ТЕЛЕГРАМ -

// ПРОКСИ +
ПроксиПротокол          = "https"; // для socks5 - https
ПроксиСервер            = "socks5://0.0.0.0"; // socks5://domain.tld
ПроксиПорт              = 1080; // 1080
ПроксиПользователь      = ""; // user
ПроксиПароль            = ""; // password              
// ПРОКСИ -

Получить данные физического лица

Получить данные физического лица (данные паспорта, прописки, адреса проживания, ФИО в полном и сокращенном формате)
ДанныеФизическогоЛица = КадровыйУчет.КадровыеДанныеФизическихЛиц(
		Истина, ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ДокументДляПечати.ФизическоеЛицо), 
		"ФИОПолные, ФамилияИО, АдресПоПрописке, ДокументВид, ДокументСерия, ДокументНомер", ДокументДляПечати.Дата);

Записать текстовый файл без BOM

Для тех кому нужно записать текстовый файл без BOM-раздела. Основная суть в записи через файловый поток
ПутьФайла = ПолучитьИмяВременногоФайла();

СтрокаТекста = "текст";

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

ФайловыйПоток = Новый ФайловыйПоток(ПутьФайла,РежимОткрытияФайла.Создать);
ТекстовыйФайл.Записать(ФайловыйПоток,КодировкаТекста.UTF8, Символы.ПС, Ложь);

ФайловыйПоток.Закрыть();

Клиент TurboStore

Программа добавляет в Конфигуратор "ТурбоПоиск", который ищет сразу по нескольким источникам данных: сервису FastCode, библиотеке стандартных подсистем (БСП) и каталогу разработок TurboStore.
bolsun 33 4
Бесплатно

Формат изображения (уменьшить,обрезать,масштабировать,сжать)

Формат изображения (уменьшить,обрезать,масштабировать,сжать)
Артур 40 1 4
&НаКлиенте
Процедура сжатьФото(Фото)
	МаксимальнаяШирина	= 700; 
	МаксимальнаяВысота	= 400;
			
	ОбрезкаЛ	=  200;
	ОбрезкаВ	=  0;
	ОбрезкаП	=  200;
	ОбрезкаН	=  0;
	
    // Создаем объект
    ФайлКартинка = Новый COMОбъект("WIA.ImageFile");
    ФайлКартинка.LoadFile(Фото);

    //Сообщить("Картинка: " + Картинка.Имя);
    //Сообщить("    Расширение файла: " + ФайлКартинка.FileExtension);
    //Сообщить("    Ширина: " + ФайлКартинка.Width);
    //Сообщить("    Высота: " + ФайлКартинка.Height);
    //Сообщить("    Размер: " + Окр(ФайлКартинка.FileData.Count / 1024, 2) + " Кб");
        
    ФайлПрогресс = Новый COMОбъект("WIA.ImageProcess"); ///ФайлПрогресс.Filters - список Фильтров, всего 8
		
    ФайлПрогресс.Filters.Add(ФайлПрогресс.FilterInfos("Scale").FilterID);    ///масштабирование  
    ФайлПрогресс.Filters.Add(ФайлПрогресс.FilterInfos("Crop").FilterID);     ///Обрезка
	ФайлПрогресс.Filters.Add(ФайлПрогресс.FilterInfos("Convert").FilterID);  ///Конвертация (Сжатия)
		
	ФайлПрогресс.Filters(1).Properties("MaximumWidth").Value  = МаксимальнаяШирина;        
	ФайлПрогресс.Filters(1).Properties("MaximumHeight").Value = МаксимальнаяВысота;	    
	ФайлПрогресс.Filters(1).Properties("PreserveAspectRatio").Value = Ложь;  ///Сохранять пропорции (По умолчанию было истина - сбивает разрешения высоту и ширину)
	
	//Форматы преобразований имееют следующий формат:
	///wiaFormatBMP    = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";      ///  .BMP
	wiaFormatJPEG   = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";         ///  .JPEG

	ФайлПрогресс.Filters(3).Properties("FormatID").Value = wiaFormatJPEG;
	ФайлПрогресс.Filters(3).Properties("Quality").Value = 50;          ///Качество фотографии  (от 1 - 100); 100 =60КБ  50 = 8КБ

	///Обрезка
	ФайлПрогресс.Filters(2).Properties("Left").Value   =  ОбрезкаЛ;       /// лево;    
	ФайлПрогресс.Filters(2).Properties("Top").Value    =  ОбрезкаВ;       /// верх;     
	ФайлПрогресс.Filters(2).Properties("Right").Value  =  ОбрезкаП;       /// право;    
	ФайлПрогресс.Filters(2).Properties("Bottom").Value =  ОбрезкаН;	      /// низ;      
	
	///Применить фильтры к фотографии
    ФайлКартинка = ФайлПрогресс.Apply(ФайлКартинка);

	///Удалить старое фото и создать новое
	УдалитьФайлы(фото);
    ФайлКартинка.SaveFile(фото);
	
	
	//Сообщить("    Расширение файла: " + ФайлКартинка.FileExtension);
	//Сообщить("    Ширина: " + ФайлКартинка.Width);
	//Сообщить("    Высота: " + ФайлКартинка.Height);
	//Сообщить("    Размер: " + Окр(ФайлКартинка.FileData.Count / 1024, 2) + " Кб");
КонецПроцедуры

Убрать итоги из готового текста запроса

Позволяет убрать итоги из текста запроса, на пример, перед передачей его в СКД
ChOP 24 4
СхемаЗапроса = новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
СхемаЗапроса.ПакетЗапросов.Получить(СхемаЗапроса.ПакетЗапросов.Количество()-1).ВыраженияИтогов.Очистить();
СхемаЗапроса.ПакетЗапросов.Получить(СхемаЗапроса.ПакетЗапросов.Количество()-1).КонтрольныеТочкиИтогов.Очистить();
Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();

Выгрузка в Excel документ

Как выгружать данные в Эксель? через COMОбъект понятно. а как происходит сам процесс выгрузки... Нуждаюсь в помощи Как выгружать данные в Эксель? через COMОбъект понятно. а как происходит сам процесс выгрузки... Нуждаюсь в помощи
Hex

OneTracker - трекер учета рабочего времени программиста 1С

Программа автоматически замеряет время работы разработчика с 1С в режиме Конфигуратора или Предприятия. Учет ведется в разрезах задач, информационных баз или объектов конфигураций.
bolsun 33 4
990 руб.

Дублирование тегов

Теги OneScript и теги БСП, существуют в нескольких экземлярах Теги OneScript и теги БСП, существуют в нескольких экземлярах

Плановая себестоимость продаж (цена на Дату документа)

Плановая себестоимость продаж (цена на Дату документа)
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ПродажиОбороты.Период КАК Период,
	|	ПродажиОбороты.Характеристика КАК Характеристика,
	|	ПродажиОбороты.Номенклатура КАК Номенклатура,
	|	ПродажиОбороты.КоличествоОборот КАК Количество,
	|	ПродажиОбороты.СуммаОборот КАК Выручка,
	|	ПродажиОбороты.Контрагент КАК Контрагент,
	|	ПродажиОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
	|	ПродажиОбороты.Ответственный КАК Ответственный
	|ПОМЕСТИТЬ втПродажиБезЦены
	|ИЗ
	|	РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, ) КАК ПродажиОбороты
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ЦеныНоменклатуры.Номенклатура КАК Номенклатура,
	|	ЦеныНоменклатуры.Характеристика КАК Характеристика,
	|	МАКСИМУМ(ЦеныНоменклатуры.Цена) КАК Цена,
	|	ЦеныНоменклатуры.Период КАК Период
	|ПОМЕСТИТЬ втЦеныПоНоменклатуре
	|ИЗ
	|	РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры
	|ГДЕ
	|	ЦеныНоменклатуры.Период <= &ДатаОкончания
	|	И ЦеныНоменклатуры.ВидЦен = &ВидЦен
	|
	|СГРУППИРОВАТЬ ПО
	|	ЦеныНоменклатуры.Номенклатура,
	|	ЦеныНоменклатуры.Характеристика,
	|	ЦеныНоменклатуры.Период
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПродажиОбороты.Период КАК Период,
	|	ЕСТЬNULL(ПродажиОбороты.Выручка, 0) КАК Выручка,
	|	ПродажиОбороты.Характеристика КАК Характеристика,
	|	ПродажиОбороты.Номенклатура КАК Номенклатура,
	|	ЕСТЬNULL(ПродажиОбороты.Количество, 0) КАК Количество,
	|	ПродажиОбороты.Контрагент КАК Контрагент,
	|	ПродажиОбороты.Ответственный КАК Ответственный,
	|	ПродажиОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
	|	МАКСИМУМ(ЦеныНоменклатуры.Период) КАК ДатаЦены
	|ПОМЕСТИТЬ втМаксПериод
	|ИЗ
	|	втПродажиБезЦены КАК ПродажиОбороты
	|		ЛЕВОЕ СОЕДИНЕНИЕ втЦеныПоНоменклатуре КАК ЦеныНоменклатуры
	|		ПО (ЦеныНоменклатуры.Номенклатура = ПродажиОбороты.Номенклатура)
	|			И (ЦеныНоменклатуры.Характеристика = ПродажиОбороты.Характеристика)
	|			И (ЦеныНоменклатуры.Период <= ПродажиОбороты.Период)
	|
	|СГРУППИРОВАТЬ ПО
	|	ПродажиОбороты.Ответственный,
	|	ПродажиОбороты.Контрагент,
	|	ПродажиОбороты.Номенклатура,
	|	ПродажиОбороты.Характеристика,
	|	ПродажиОбороты.Период,
	|	ПродажиОбороты.ЗаказПокупателя,
	|	ЕСТЬNULL(ПродажиОбороты.Выручка, 0),
	|	ЕСТЬNULL(ПродажиОбороты.Количество, 0)
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	Заказ_Поставщику.ЗаказПокупателя КАК ЗаказПокупателя,
	|	СУММА(ЗаказПоставщикуЗапасы.Сумма) КАК Сумма
	|ПОМЕСТИТЬ ВТЗатратыНаСубподряд
	|ИЗ
	|	Документ.ЗаказПоставщику.Запасы КАК ЗаказПоставщикуЗапасы
	|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПоставщику КАК Заказ_Поставщику
	|			ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ЗаказПокупателя КАК Заказ_Покупателя
	|			ПО Заказ_Поставщику.ЗаказПокупателя = Заказ_Покупателя.Ссылка
	|		ПО ЗаказПоставщикуЗапасы.Ссылка = Заказ_Поставщику.Ссылка
	|ГДЕ
	|	Заказ_Покупателя.Дата > ДОБАВИТЬКДАТЕ(&ДатаНачала, ГОД, -1) И  Заказ_Покупателя.Контрагент НЕ В (&КонтрагентыБезСубподряда)
	|
	|СГРУППИРОВАТЬ ПО
	|	Заказ_Поставщику.ЗаказПокупателя
	|;
	|
	|////////////////////////////////////////////////////////////////////////////////
	|ВЫБРАТЬ
	|	ПродажиОбороты.Характеристика КАК Характеристика,
	|	ПродажиОбороты.Номенклатура КАК Номенклатура,
	|	ПродажиОбороты.Количество КАК Количество,
	|	ПродажиОбороты.Выручка КАК Выручка,
	|	ПродажиОбороты.Контрагент КАК Контрагент,
	|	ПродажиОбороты.Ответственный КАК Ответственный,
	|	ПродажиОбороты.Период КАК Период,
	|	ПродажиОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
	|	ЦеныНоменклатуры.Цена КАК Цена,
	|	isnull(ЦеныНоменклатуры.Цена,0) * ПродажиОбороты.Количество КАК Себестоимость,
	|	isnull(ВТЗатратыНаСубподряд.Сумма,0) КАК Субподряд
	|ИЗ
	|	втМаксПериод КАК ПродажиОбороты
	|		ЛЕВОЕ СОЕДИНЕНИЕ втЦеныПоНоменклатуре КАК ЦеныНоменклатуры
	|		ПО (ЦеныНоменклатуры.Номенклатура = ПродажиОбороты.Номенклатура)
	|			И (ЦеныНоменклатуры.Период = ПродажиОбороты.ДатаЦены)
	|			И ПродажиОбороты.Характеристика = ЦеныНоменклатуры.Характеристика
	|		ЛЕВОЕ СОЕДИНЕНИЕ ВТЗатратыНаСубподряд КАК ВТЗатратыНаСубподряд
	|		ПО ПродажиОбороты.ЗаказПокупателя = ВТЗатратыНаСубподряд.ЗаказПокупателя
	|
	|СГРУППИРОВАТЬ ПО
	|	ПродажиОбороты.Ответственный,
	|	ПродажиОбороты.Характеристика,
	|	ПродажиОбороты.Контрагент,
	|	ПродажиОбороты.ЗаказПокупателя,
	|	ПродажиОбороты.Номенклатура,
	|	ПродажиОбороты.Количество,
	|	ПродажиОбороты.Период,
	|	ПродажиОбороты.Выручка,
	|	ЦеныНоменклатуры.Цена,
	|	ПродажиОбороты.ДатаЦены,
	|	ЦеныНоменклатуры.Цена * ПродажиОбороты.Количество,
	|	ВТЗатратыНаСубподряд.Сумма
	|ИТОГИ
	|	СУММА(Количество),
	|	СУММА(Выручка),
	|	СУММА(Себестоимость),
	|	МАКСИМУМ(Субподряд)
	|ПО
	|	Ответственный,
	|	Контрагент,
	|	ЗаказПокупателя,
	|	Номенклатура";

Программное получение СочетаниеКлавиш

Дает возможность назначить нестандартные кнопки - например Enter(13) , Esc(27), Del(46) и т.д.
DiKSer 11 2
// Возвращает сочетание клавиш из скан-кода
//
// Параметры:
//  Код - Строка - скан-код клавиши
//  Alt - Число - факт нажатия клавиши alt
//  Control - Число - факт нажатия клавиши Control
//  Shift - Число - факт нажатия клавиши Shift
//
// Возвращаемое значение:
//   СочетаниеКлавиш - программное сочетание клавиш
//
Функция ПолучитьСочетаниеКлавишПоКоду(Код, Alt = 0, Control = 0, Shift = 0) Экспорт
    Возврат ЗначениеИзСтрокиВнутр("{""#"", 69cf4251-8759-11d5-bf7e-0050bae2bc79, 1,
        |{0, " + Формат(Код, "ЧН=0; ЧГ=0") + ", " + Формат(Alt * 16 + Control * 8 + Shift * 4, "ЧН=0; ЧГ=0") + "}
        |}");
КонецФункции

// https://filestore.community.support.microsoft.com/api/images/924f1958-8fe8-41a8-b34b-6018c6283a05 - скан-коды клавиатуры

Установить отбор пользовательских настроек динамического списка

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

//Если нет БСП то используем велосипед
//Вызывающий код
мФорма = ОткрытьФорму("Справочник.Номенклатура.ФормаСписка");
УстановитьПользовательскийОтборДинамическогоСписка(мФорма.Список, "ПометкаУдаления", Ложь, ВидСравненияКомпоновкиДанных.Равно);
		

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

Отслеживание изменений отбора

изменение отбора, обработчик изменения отбора
DiKSer 11 2
//Подключаем обработчик изменения на отбор в данном случае у регистра сведений список при открытии- 
Процедура ПриОткрытии()
    ПодключитьОбработчикИзмененияДанных("РегистрСведенийСписок.Отбор", "ОбработкаОтбора",Истина);
	
	ОбработкаОтбора(Неопределено);
КонецПроцедуры

Процедура ОбработкаОтбора(Элемент)
	
    // Элемент - то что изменилось в Отборе - например Период.ВидСравнения
    // тут можно обработать изменения отбора 
		
КонецПроцедуры

Элемент справочника

Ищет/создаёт элемент справочника
SDV 31 6
// Функция - Элемент справочника ищет/создаёт элемент справочника
//
// Параметры:
//  НазваниеСправочника      - Строка - Название справочника элемент которого необходимо вернуть
//  СтруктураПараметров      - Структура - Ключ = Название реквизиты, Значение = Значение
//  Режим - Число                 - Варианты:
//                                        1 - ищет и возвращает ссылку;
//                                        2 - ищет и возвращает ссылку, если не находит создаёт новый элемент и возвращает ссылку на него
//                                        3 - создаёт новый элемент и возвращает ссылку на него
//
// Возвращаемое значение:
//  СправочникСсылка
//
Функция ЭлементСправочника(НазваниеСправочника, СтруктураПараметров, Режим = 2) Экспорт
    
    Результат = Неопределено;
    
    Искать = (Режим = 1 или Режим = 2);
    
    Если Искать тогда
        Запрос = Новый Запрос;
        ТекстУсловий = "";
        Для Каждого ЭлементСтруктуры из СтруктураПараметров Цикл
            Запрос.Параметры.Вставить(ЭлементСтруктуры.Ключ, ЭлементСтруктуры.Значение);
            ОбъектМетаданных = Метаданные.Справочники[НазваниеСправочника].Реквизиты.Найти(ЭлементСтруктуры.Ключ);
            Если ОбъектМетаданных = Неопределено Тогда
                ОбъектМетаданных = Метаданные.Справочники[НазваниеСправочника].СтандартныеРеквизиты[ЭлементСтруктуры.Ключ];
            КонецЕсли;
            Тип = ОбъектМетаданных.Тип;
            //Новый ОписаниеТипов(
            Если Тип = Новый ОписаниеТипов("Строка") Тогда
                //и Тип.КвалификаторыСтроки.Длина = 0 Тогда
                ТекстУсловий = ТекстУсловий + "ВЫРАЗИТЬ(" + НазваниеСправочника + "." + ЭлементСтруктуры.Ключ
                + " КАК СТРОКА(1000)) = ВЫРАЗИТЬ(&" + ЭлементСтруктуры.Ключ + " КАК СТРОКА(1000)) И ";
            Иначе
                
                ТекстУсловий = ТекстУсловий + НазваниеСправочника + "." + ЭлементСтруктуры.Ключ + " = &" + ЭлементСтруктуры.Ключ + " И ";
                
            КонецЕсли;
        КонецЦикла;
        ТекстУсловий = ТекстУсловий + "ИСТИНА = ИСТИНА";
        Запрос.Текст = "ВЫБРАТЬ " + НазваниеСправочника + ".Ссылка ИЗ Справочник." + НазваниеСправочника  + " КАК " + НазваниеСправочника + " ГДЕ " + ТекстУсловий;
        
        ТЗ_РезультатЗапроса = Запрос.Выполнить().Выгрузить();
        
        Если ТЗ_РезультатЗапроса.Количество() = 1 Тогда
            Результат = ТЗ_РезультатЗапроса[0].Ссылка;
        ИначеЕсли ТЗ_РезультатЗапроса.Количество() > 1 Тогда
            Сообщить("Найдено более одного элемента:");
            Сообщить(ТЗ_РезультатЗапроса[0].Ссылка);
            Результат = ТЗ_РезультатЗапроса[0].Ссылка;
        КонецЕсли;
    КонецЕсли;
    
    Создавать = (Режим = 3 или (Режим = 2 и не ЗначениеЗаполнено(Результат)));
    
    Если Создавать Тогда
        Если СтруктураПараметров.Свойство("ЭтоГруппа") и СтруктураПараметров.ЭтоГруппа Тогда
            НовыйЭлемент = Справочники[НазваниеСправочника].СоздатьГруппу();
        Иначе
            НовыйЭлемент = Справочники[НазваниеСправочника].СоздатьЭлемент();
        КонецЕсли;
        
        ЗаполнитьЗначенияСвойств(НовыйЭлемент, СтруктураПараметров);
        НовыйЭлемент.Записать();
        Результат = НовыйЭлемент.Ссылка;
    КонецЕсли;
    
    Возврат Результат;
    
КонецФункции

Путь к файлу

Открывает диалог выбора пути к файлу (каталогу), возвращает путь
SDV 31 6
// Функция - Путь к файлу
//
// Параметры:
//  Заголовок     - Строка - НПР: "Укажите путь к базе Поставщиков"
//  Фильтр         - Строка -    НПР: "(*.txt)|*.txt"
//  Режим         - РежимДиалогаВыбораФайла - НПР: РежимДиалогаВыбораФайла.Открытие
//  ИсходныйПуть - Строка - НПР: Путь чтобы выбор начинался в определённом месте
//
// Возвращаемое значение:
//  Строка, Неопределено -  В случае успеха Путь в виде Строки, иначе Неопределено
//
// Пример:
//  Элемент.Значение = ПутьКФайлу("Выберите путь к файлу с данными (xls):","(*.xls*)|*.xls*", РежимДиалогаВыбораФайла.Открытие, Элемент.Значение)
Функция ПутьКФайлу(Заголовок, Фильтр, Режим, ИсходныйПуть = Неопределено) Экспорт
    Результат = Неопределено;
    ДиалогОткрытияФайла  = Новый ДиалогВыбораФайла (Режим);
    //выбор начнётся по исходному пути?!
    Если ИсходныйПуть <> Неопределено Тогда
        Если Режим =  РежимДиалогаВыбораФайла.ВыборКаталога Тогда
            ДиалогОткрытияФайла.Каталог = ИсходныйПуть;
        ИначеЕсли  Режим = ДиалогОткрытияФайла.ПолноеИмяФайла  Тогда
            ДиалогОткрытияФайла.ПолноеИмяФайла = ИсходныйПуть;
        КонецЕсли;
    КонецЕсли;
    ДиалогОткрытияФайла.ПолноеИмяФайла     = "";
    ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
    ДиалогОткрытияФайла.Заголовок          = Заголовок;
    ДиалогОткрытияФайла.Фильтр = Фильтр;
    Успех = ДиалогОткрытияФайла.Выбрать();
    Если Успех Тогда
        Если Режим = РежимДиалогаВыбораФайла.ВыборКаталога Тогда
            Результат = ДиалогОткрытияФайла.Каталог;
        Иначе
            Результат = ДиалогОткрытияФайла.ПолноеИмяФайла;
        КонецЕсли;
    Иначе
        Результат = Неопределено;
    КонецЕсли;
    Возврат Результат;
КонецФункции

Загрузить колонку (создавать строки Таблицы при необходимости)

Альтернатива странному методу ЗагрузитьКолонку объектов типа ТаблицаЗначений, ТабличнаяЧасть
SDV 31 6
// Процедура - Загрузить колонку
//
// Параметры:
//  Таблица             - ТаблицаЗначений, ТабличнаяЧасть
//  МассивЗначений     - Массив
//  Колонка             - Строка
//  Очищать             - Булево - Необязательно. По-умолчанию Истина.
//                                Если Истина, то таблица предварительно очищается.
//                                
Процедура ЗагрузитьКолонку(Таблица, МассивЗначений, Колонка, Очищать = Истина) Экспорт
    Если Очищать Тогда
        Таблица.Очистить();
    КонецЕсли;


    МаксимальныйИндексТаблицы = Таблица.Количество() - 1;
    МаксимальныйИндексМассива = МассивЗначений.Количество() - 1;
    
    Для ИндексМассива = 0 по МаксимальныйИндексМассива Цикл
        Если ИндексМассива > МаксимальныйИндексТаблицы Тогда
            Строка = Таблица.Добавить();
        Иначе
            Строка = Таблица[ИндексМассива];
        КонецЕсли;
        Строка[Колонка] = МассивЗначений[ИндексМассива];
    КонецЦикла;
    
КонецПроцедуры

OneScript

OpenSource инструмент автоматизации для специалистов по 1С. Проект является независимой кросс-платформенной реализацией виртуальной машины, исполняющей скрипты на языке 1С:Предприятие.
bolsun 33 4
Бесплатно

Оформление (раскраска) строки табличной части обычной формы по условию, при получении данных

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