Разработай мини-сайт на современном фреймворке NuxtJS для оформления заказов контрагентами!
Блог Жёлтая тетрадь 📒 http://t.me/yellow_pad
В 1С нет возможности выполнить произвольный код с возвратом результата. Можно результат вычисления произвольного кода присвоить переменной Результат и реализовать экспортную функцию с методом Выполнить.
Функция ВычислитьФункцию(Знач ПроизвольныйКод) Экспорт
Результат = Неопределено;
Выполнить(ПроизвольныйКод);
Если Результат = Неопределено Тогда
ВызватьИсключение "Не присвоено значение результата (Результат = Неопределено).";
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ВычислитьФункцию(Знач ПроизвольныйКод) Экспорт
Результат = Неопределено;
Выполнить(ПроизвольныйКод);
Если Результат = Неопределено Тогда
ВызватьИсключение "Не присвоено значение результата (Результат = Неопределено).";
КонецЕсли;
Возврат Результат;
КонецФункции
ред. 25 февраля 2021 05:39
Программа автоматически замеряет время работы разработчика с 1С в режиме Конфигуратора или Предприятия. Учет ведется в разрезах задач, информационных баз или объектов конфигураций.
Метод не требует смены контекста исполнения кода (подходит для размещения в клиент-серверном общем модуле).
// Сортирует массив через методы объекта "СписокЗначений".
// Внимание: в результате сортировки меняется исходный (передаваемый в функцию) массив.
//
// Параметры:
// МассивДляУпорядочивания - Массив - Массив элементов, которые необходимо упорядочить (по значению или по представлению).
// Внимание: в результате сортировки меняется исходный (передаваемый в функцию) массив.
// ПорядокСортировки - Строка - "Возр" или "Убыв".
// СортироватьПоЗначению - Булево - Если Ложь, то сортировать по представлению.
//
// Возвращаемое значение:
// Массив - упорядоченный массив.
//
Функция УпорядочитьМассив(МассивДляУпорядочивания, Знач ПорядокСортировки = "Возр", Знач СортироватьПоЗначению = Истина) Экспорт
лПорядокСортировки = НаправлениеСортировки.Возр;
Если НРег(ПорядокСортировки) = НРег("Убыв") Тогда
лПорядокСортировки = НаправлениеСортировки.Убыв;
КонецЕсли;
СЗ = Новый СписокЗначений;
СЗ.ЗагрузитьЗначения(МассивДляУпорядочивания);
Если СортироватьПоЗначению Тогда
СЗ.СортироватьПоЗначению(лПорядокСортировки);
Иначе
СЗ.СортироватьПоПредставлению(лПорядокСортировки);
КонецЕсли;
МассивДляУпорядочивания = СЗ.ВыгрузитьЗначения();
Возврат МассивДляУпорядочивания;
КонецФункции
// Сортирует массив через методы объекта "СписокЗначений".
// Внимание: в результате сортировки меняется исходный (передаваемый в функцию) массив.
//
// Параметры:
// МассивДляУпорядочивания - Массив - Массив элементов, которые необходимо упорядочить (по значению или по представлению).
// Внимание: в результате сортировки меняется исходный (передаваемый в функцию) массив.
// ПорядокСортировки - Строка - "Возр" или "Убыв".
// СортироватьПоЗначению - Булево - Если Ложь, то сортировать по представлению.
//
// Возвращаемое значение:
// Массив - упорядоченный массив.
//
Функция УпорядочитьМассив(МассивДляУпорядочивания, Знач ПорядокСортировки = "Возр", Знач СортироватьПоЗначению = Истина) Экспорт
лПорядокСортировки = НаправлениеСортировки.Возр;
Если НРег(ПорядокСортировки) = НРег("Убыв") Тогда
лПорядокСортировки = НаправлениеСортировки.Убыв;
КонецЕсли;
СЗ = Новый СписокЗначений;
СЗ.ЗагрузитьЗначения(МассивДляУпорядочивания);
Если СортироватьПоЗначению Тогда
СЗ.СортироватьПоЗначению(лПорядокСортировки);
Иначе
СЗ.СортироватьПоПредставлению(лПорядокСортировки);
КонецЕсли;
МассивДляУпорядочивания = СЗ.ВыгрузитьЗначения();
Возврат МассивДляУпорядочивания;
КонецФункции
ред. 24 февраля 2021 16:18
Процедура подставляет в последний пакет набора данных запроса конструкцию ВЫБРАТЬ ПЕРВЫЕ N
// Подставляет в последний пакет набора данных запроса конструкцию ВЫБРАТЬ ПЕРВЫЕ N
//
// Параметры:
// НаборДанных - НаборДанныхЗапросСхемыКомпоновкиДанных - Набор данных СКД
// КоличествоПолучаемыхЗаписей - Число, Неопределено - Количество получаемых записей.
// Соответствует ключевому слову ПЕРВЫЕ языка запросов.
// Если Неопределено, ограничение на количество выбираемых записей отсутствует.
//
Процедура УстановитьКоличествоПолучаемыхЗаписейНабораДанных(НаборДанных, КоличествоПолучаемыхЗаписей) Экспорт
СхемаЗапроса = Новый СхемаЗапроса();
СхемаЗапроса.РежимКомпоновкиДанных = Истина;
СхемаЗапроса.УстановитьТекстЗапроса(НаборДанных.Запрос);
ПоследнийПакет = СхемаЗапроса.ПакетЗапросов.Получить(СхемаЗапроса.ПакетЗапросов.Количество()-1);
ПоследнийПакет.Операторы.Получить(0).КоличествоПолучаемыхЗаписей = КоличествоПолучаемыхЗаписей;
НаборДанных.Запрос = СхемаЗапроса.ПолучитьТекстЗапроса();
КонецПроцедуры
// Подставляет в последний пакет набора данных запроса конструкцию ВЫБРАТЬ ПЕРВЫЕ N
//
// Параметры:
// НаборДанных - НаборДанныхЗапросСхемыКомпоновкиДанных - Набор данных СКД
// КоличествоПолучаемыхЗаписей - Число, Неопределено - Количество получаемых записей.
// Соответствует ключевому слову ПЕРВЫЕ языка запросов.
// Если Неопределено, ограничение на количество выбираемых записей отсутствует.
//
Процедура УстановитьКоличествоПолучаемыхЗаписейНабораДанных(НаборДанных, КоличествоПолучаемыхЗаписей) Экспорт
СхемаЗапроса = Новый СхемаЗапроса();
СхемаЗапроса.РежимКомпоновкиДанных = Истина;
СхемаЗапроса.УстановитьТекстЗапроса(НаборДанных.Запрос);
ПоследнийПакет = СхемаЗапроса.ПакетЗапросов.Получить(СхемаЗапроса.ПакетЗапросов.Количество()-1);
ПоследнийПакет.Операторы.Получить(0).КоличествоПолучаемыхЗаписей = КоличествоПолучаемыхЗаписей;
НаборДанных.Запрос = СхемаЗапроса.ПолучитьТекстЗапроса();
КонецПроцедуры
Блог Жёлтая тетрадь 📒 http://t.me/yellow_pad
Передача нескольких табличных документов в подсистему печати для вывода пакета документов с индивидуальными параметрами печати для каждой страницы печатной формы.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ext_ТОРГ2_АктОРасхожденияхПослеПриемки");
Если ПечатнаяФорма <> Неопределено Тогда
МассивТабличныхДокументов = СформироватьПечатнуюФормуТорг2(СтруктураТипов, ОбъектыПечати, ПараметрыВывода);
//в массив возвращаем столько частей печатной формы, сколько нужно, задав для каждой ориентацию и масштаб
Для К = 1 По МассивТабличныхДокументов.Количество() Цикл
НоваяСтрока = КоллекцияПечатныхФорм.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ПечатнаяФорма);
НоваяСтрока.ТабличныйДокумент = МассивТабличныхДокументов[К-1];
НоваяСтрока.ИмяМакета = НоваяСтрока.ИмяМакета + К;
НоваяСтрока.ИмяВРЕГ = НоваяСтрока.ИмяВРЕГ + К;
НоваяСтрока.СинонимМакета = СтрШаблон(НСтр("ru = 'ТОРГ-2 [%1 из %2]'"), К, МассивТабличныхДокументов.Количество());
КонецЦикла;
КоллекцияПечатныхФорм.Удалить(ПечатнаяФорма);
КонецЕсли;
ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
КонецПроцедуры
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "ext_ТОРГ2_АктОРасхожденияхПослеПриемки");
Если ПечатнаяФорма <> Неопределено Тогда
МассивТабличныхДокументов = СформироватьПечатнуюФормуТорг2(СтруктураТипов, ОбъектыПечати, ПараметрыВывода);
//в массив возвращаем столько частей печатной формы, сколько нужно, задав для каждой ориентацию и масштаб
Для К = 1 По МассивТабличныхДокументов.Количество() Цикл
НоваяСтрока = КоллекцияПечатныхФорм.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ПечатнаяФорма);
НоваяСтрока.ТабличныйДокумент = МассивТабличныхДокументов[К-1];
НоваяСтрока.ИмяМакета = НоваяСтрока.ИмяМакета + К;
НоваяСтрока.ИмяВРЕГ = НоваяСтрока.ИмяВРЕГ + К;
НоваяСтрока.СинонимМакета = СтрШаблон(НСтр("ru = 'ТОРГ-2 [%1 из %2]'"), К, МассивТабличныхДокументов.Количество());
КонецЦикла;
КоллекцияПечатныхФорм.Удалить(ПечатнаяФорма);
КонецЕсли;
ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм);
КонецПроцедуры
ред. 16 февраля 2021 09:47
Внешняя Native API компонента для выполнения регулярных выражений на платформе 1С:Предприятие 8. Поддерживает Windows, Linux, MacOS, Android, Chrome
Блог Жёлтая тетрадь 📒 http://t.me/yellow_pad
Опциональное выполнение метода в фоне средствами БСП
Процедура ВыполнитьВыгрузку(ВидВыгрузки, МестоВызова, ИсточникСсылка, ВФоне = Ложь, Отказ = Ложь) Экспорт
Если НЕ ЗначениеЗаполнено(ИсточникСсылка) Тогда
Возврат;
КонецЕсли;
Если ВФоне Тогда
ДлительныеОперации.ВыполнитьПроцедуру(, "БизнесПроцессыСлужебный.ПолучитьВыборкуИВыгрузить", ВидВыгрузки, МестоВызова, ИсточникСсылка);
Иначе
БизнесПроцессыСлужебный.ПолучитьВыборкуИВыгрузить(ВидВыгрузки, МестоВызова, ИсточникСсылка);
КонецЕсли;
КонецПроцедуры
Процедура ВыполнитьВыгрузку(ВидВыгрузки, МестоВызова, ИсточникСсылка, ВФоне = Ложь, Отказ = Ложь) Экспорт
Если НЕ ЗначениеЗаполнено(ИсточникСсылка) Тогда
Возврат;
КонецЕсли;
Если ВФоне Тогда
ДлительныеОперации.ВыполнитьПроцедуру(, "БизнесПроцессыСлужебный.ПолучитьВыборкуИВыгрузить", ВидВыгрузки, МестоВызова, ИсточникСсылка);
Иначе
БизнесПроцессыСлужебный.ПолучитьВыборкуИВыгрузить(ВидВыгрузки, МестоВызова, ИсточникСсылка);
КонецЕсли;
КонецПроцедуры
ред. 16 февраля 2021 09:00
Парсинг строки с помощью RegExp. Вариант через COMОбъект.
//Получить из строки значение productId в формате числа
ПроверяемаяСтрока = "?productId=3453466&vendorId=02";
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
// \d+ - последовательность чисел, не меньше 1 символа
// скобки - захватить значение в отдельную группу
RegExp.Pattern = "productId=(\d+)";
Matches=RegExp.Execute(ПроверяемаяСтрока);
Если Matches.Count > 0 Тогда
SubMatch = Matches.Item(0);
//Получаем значение первой захваченной группы
productId= SubMatch.SubMatches.Item(0);
Сообщить("productId: " + productId);
КонецЕсли;
//Получить из строки значение productId в формате числа
ПроверяемаяСтрока = "?productId=3453466&vendorId=02";
RegExp = Новый COMОбъект("VBScript.RegExp");
RegExp.MultiLine = Истина;
RegExp.Global = Истина;
RegExp.IgnoreCase = Истина;
// \d+ - последовательность чисел, не меньше 1 символа
// скобки - захватить значение в отдельную группу
RegExp.Pattern = "productId=(\d+)";
Matches=RegExp.Execute(ПроверяемаяСтрока);
Если Matches.Count > 0 Тогда
SubMatch = Matches.Item(0);
//Получаем значение первой захваченной группы
productId= SubMatch.SubMatches.Item(0);
Сообщить("productId: " + productId);
КонецЕсли;
ред. 15 февраля 2021 10:30
ИмяОбработки = ЭтотОбъект.Метаданные().ПолноеИмя();
КаталогСохранения = ХранилищеНастроекДанныхФорм.Загрузить(ИмяОбработки, "КаталогСохранения");
Если ПустаяСтрока(КаталогСохранения) Тогда
WSS = Новый COMОбъект("WScript.Shell");
КаталогСохранения = WSS.SpecialFolders().Item("MyDocuments");
WSS = Неопределено;
КонецЕсли;
ИмяОбработки = ЭтотОбъект.Метаданные().ПолноеИмя();
КаталогСохранения = ХранилищеНастроекДанныхФорм.Загрузить(ИмяОбработки, "КаталогСохранения");
Если ПустаяСтрока(КаталогСохранения) Тогда
WSS = Новый COMОбъект("WScript.Shell");
КаталогСохранения = WSS.SpecialFolders().Item("MyDocuments");
WSS = Неопределено;
КонецЕсли;
ред. 11 февраля 2021 14:30
Блог Жёлтая тетрадь 📒 http://t.me/yellow_pad
Читатель блога I N поделился найденным в интернете полезным кодом для установки произвольного отбора формы выбора при начале выбора из элемента формы (без отдельной кнопки и команды).
НаКлиенте
Процедура Магази...
ред. 08 февраля 2021 09:37
Рекурсивно удаляет недоступные элементы из коллекции отборов
Написан для статьи "Как ограничить поля отбора в динамическом списке и ничего не сломать"
https://infostart.ru/public/1226445/?ref=1159
Пример использования для ДС:
Список.УстановитьОграниченияИспользованияВОтборе(ЗапрещенныеВОтбореПоля);
УдалитьНедоступныеОтборы(Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы);
// Рекурсивно удаляет недоступные элементы из коллекции отборов
//
// Написан для статьи Как ограничить поля отбора в динамическом списке и ничего не сломать:
// https://infostart.ru/public/1226445/?ref=1159
//
// Пример использования для ДС:
// Список.УстановитьОграниченияИспользованияВОтборе(ЗапрещенныеВОтбореПоля);
// УдалитьНедоступныеОтборы(Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы);
//
// Параметры:
// Коллекция - Массив, КоллекцияЭлементовПользовательскихНастроекКомпоновкиДанных, КоллекцияЭлементовОтбораКомпоновкиДанных - Коллекция элементов отбора.
// ДоступныеПоляОтбора - Неопределено, ДоступныеПоляКомпоновкиДанных - Список доступных полей отбора. При первоначальном вызове не передаётся.
//
Процедура УдалитьНедоступныеОтборы(Коллекция, ДоступныеПоляОтбора = Неопределено)
УдаляемыеЭлементы = Новый Массив;
Для Каждого ТекущиеДанные Из Коллекция Цикл
Если ТипЗнч(ТекущиеДанные) = Тип("ОтборКомпоновкиДанных") Тогда
УдалитьНедоступныеОтборы(ТекущиеДанные.Элементы, ТекущиеДанные.ДоступныеПоляОтбора);
ИначеЕсли ТипЗнч(ТекущиеДанные) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
УдалитьНедоступныеОтборы(ТекущиеДанные.Элементы, ДоступныеПоляОтбора);
ИначеЕсли ТипЗнч(ТекущиеДанные) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
Если НЕ ТекущиеДанные.Использование Тогда
Продолжить;
КонецЕсли;
Для Каждого ИмяСвойства Из СтрРазделить("ЛевоеЗначение,ПравоеЗначение",",") Цикл
ТекущееПоле = ТекущиеДанные[ИмяСвойства];
Если ТипЗнч(ТекущееПоле) = Тип("ПолеКомпоновкиДанных")
И ДоступныеПоляОтбора.НайтиПоле(ТекущееПоле) = Неопределено Тогда
УдаляемыеЭлементы.Добавить(ТекущиеДанные);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Для Каждого УдаляемыйЭлемент Из УдаляемыеЭлементы Цикл
Коллекция.Удалить(УдаляемыйЭлемент);
КонецЦикла;
КонецПроцедуры
// Рекурсивно удаляет недоступные элементы из коллекции отборов
//
// Написан для статьи Как ограничить поля отбора в динамическом списке и ничего не сломать:
// https://infostart.ru/public/1226445/?ref=1159
//
// Пример использования для ДС:
// Список.УстановитьОграниченияИспользованияВОтборе(ЗапрещенныеВОтбореПоля);
// УдалитьНедоступныеОтборы(Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы);
//
// Параметры:
// Коллекция - Массив, КоллекцияЭлементовПользовательскихНастроекКомпоновкиДанных, КоллекцияЭлементовОтбораКомпоновкиДанных - Коллекция элементов отбора.
// ДоступныеПоляОтбора - Неопределено, ДоступныеПоляКомпоновкиДанных - Список доступных полей отбора. При первоначальном вызове не передаётся.
//
Процедура УдалитьНедоступныеОтборы(Коллекция, ДоступныеПоляОтбора = Неопределено)
УдаляемыеЭлементы = Новый Массив;
Для Каждого ТекущиеДанные Из Коллекция Цикл
Если ТипЗнч(ТекущиеДанные) = Тип("ОтборКомпоновкиДанных") Тогда
УдалитьНедоступныеОтборы(ТекущиеДанные.Элементы, ТекущиеДанные.ДоступныеПоляОтбора);
ИначеЕсли ТипЗнч(ТекущиеДанные) = Тип("ГруппаЭлементовОтбораКомпоновкиДанных") Тогда
УдалитьНедоступныеОтборы(ТекущиеДанные.Элементы, ДоступныеПоляОтбора);
ИначеЕсли ТипЗнч(ТекущиеДанные) = Тип("ЭлементОтбораКомпоновкиДанных") Тогда
Если НЕ ТекущиеДанные.Использование Тогда
Продолжить;
КонецЕсли;
Для Каждого ИмяСвойства Из СтрРазделить("ЛевоеЗначение,ПравоеЗначение",",") Цикл
ТекущееПоле = ТекущиеДанные[ИмяСвойства];
Если ТипЗнч(ТекущееПоле) = Тип("ПолеКомпоновкиДанных")
И ДоступныеПоляОтбора.НайтиПоле(ТекущееПоле) = Неопределено Тогда
УдаляемыеЭлементы.Добавить(ТекущиеДанные);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Для Каждого УдаляемыйЭлемент Из УдаляемыеЭлементы Цикл
Коллекция.Удалить(УдаляемыйЭлемент);
КонецЦикла;
КонецПроцедуры
ред. 04 февраля 2021 12:31
Быстрее всего удаляются строки путем копирования оставшихся строк по условию, обратному к условию удаления:
РабочаяТаблица = РабочаяТаблица.Скопировать(Новый Структура("КУдалению", Ложь))
РабочаяТаблица = РабочаяТаблица.Скопировать(Новый Структура("КУдалению", Ложь))
ред. 04 февраля 2021 05:17
Возвращает всех родителей элемента, согласно рекомендациям на ИТС:
"Получение всех родителей элемента" (https://its.1c.ru/db/metod8dev/content/2659/hdoc)
// Возвращает всех родителей элемента, согласно рекомендациям на ИТС:
// "Получение всех родителей элемента" (https://its.1c.ru/db/metod8dev/content/2659/hdoc)
//
// Параметры:
// СсылкаНаЭлемент - СправочникСсылка, ПланВидовХарактеристикСсылка - Ссылка на элемент, родителей которого нужно найти
// КоличествоВыбираемыхЗаПорцию - Число - Количество выбираемых родителей за одно выполнение запроса.
// Используется минимальное число из переданного и ограничения количества уровней в конфигураторе
//
// Возвращаемое значение:
// Массив[СправочникСсылка, ПланВидовХарактеристикСсылка] - массив с родителями элемента
//
&НаСервереБезКонтекста
Функция РодителиЭлемента(СсылкаНаЭлемент, Знач КоличествоВыбираемыхЗаПорцию = 5)
РодителиЭлемента = Новый Массив;
Если НЕ ЗначениеЗаполнено(СсылкаНаЭлемент) Тогда
Возврат РодителиЭлемента;
КонецЕсли;
МетаданныеЭлемента = СсылкаНаЭлемент.Метаданные();
Если МетаданныеЭлемента.ОграничиватьКоличествоУровней Тогда
КоличествоВыбираемыхЗаПорцию = Мин(КоличествоВыбираемыхЗаПорцию, МетаданныеЭлемента.КоличествоУровней);
КонецЕсли;
ВыбираемыеПоля = Новый Массив;
ВыбираемоеПоле = "Родитель";
Для НомерРодителя = 1 По КоличествоВыбираемыхЗаПорцию Цикл
ВыбираемыеПоля.Добавить(ВыбираемоеПоле);
ВыбираемоеПоле = ВыбираемоеПоле + ".Родитель";
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ %1 ИЗ %2 ГДЕ Ссылка = &ТекущийЭлемент";
ТекстЗапроса = СтрШаблон(ТекстЗапроса, СтрСоединить(ВыбираемыеПоля, ","), МетаданныеЭлемента.ПолноеИмя());
Запрос = Новый Запрос(ТекстЗапроса);
ТекущийЭлемент = СсылкаНаЭлемент;
Пока ЗначениеЗаполнено(ТекущийЭлемент) Цикл
Запрос.УстановитьПараметр("ТекущийЭлемент", ТекущийЭлемент);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл
ТекущийЭлемент = Выборка[НомерКолонки];
Если ЗначениеЗаполнено(ТекущийЭлемент) Тогда
РодителиЭлемента.Добавить(ТекущийЭлемент);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат РодителиЭлемента;
КонецФункции
// Возвращает всех родителей элемента, согласно рекомендациям на ИТС:
// "Получение всех родителей элемента" (https://its.1c.ru/db/metod8dev/content/2659/hdoc)
//
// Параметры:
// СсылкаНаЭлемент - СправочникСсылка, ПланВидовХарактеристикСсылка - Ссылка на элемент, родителей которого нужно найти
// КоличествоВыбираемыхЗаПорцию - Число - Количество выбираемых родителей за одно выполнение запроса.
// Используется минимальное число из переданного и ограничения количества уровней в конфигураторе
//
// Возвращаемое значение:
// Массив[СправочникСсылка, ПланВидовХарактеристикСсылка] - массив с родителями элемента
//
&НаСервереБезКонтекста
Функция РодителиЭлемента(СсылкаНаЭлемент, Знач КоличествоВыбираемыхЗаПорцию = 5)
РодителиЭлемента = Новый Массив;
Если НЕ ЗначениеЗаполнено(СсылкаНаЭлемент) Тогда
Возврат РодителиЭлемента;
КонецЕсли;
МетаданныеЭлемента = СсылкаНаЭлемент.Метаданные();
Если МетаданныеЭлемента.ОграничиватьКоличествоУровней Тогда
КоличествоВыбираемыхЗаПорцию = Мин(КоличествоВыбираемыхЗаПорцию, МетаданныеЭлемента.КоличествоУровней);
КонецЕсли;
ВыбираемыеПоля = Новый Массив;
ВыбираемоеПоле = "Родитель";
Для НомерРодителя = 1 По КоличествоВыбираемыхЗаПорцию Цикл
ВыбираемыеПоля.Добавить(ВыбираемоеПоле);
ВыбираемоеПоле = ВыбираемоеПоле + ".Родитель";
КонецЦикла;
ТекстЗапроса = "ВЫБРАТЬ %1 ИЗ %2 ГДЕ Ссылка = &ТекущийЭлемент";
ТекстЗапроса = СтрШаблон(ТекстЗапроса, СтрСоединить(ВыбираемыеПоля, ","), МетаданныеЭлемента.ПолноеИмя());
Запрос = Новый Запрос(ТекстЗапроса);
ТекущийЭлемент = СсылкаНаЭлемент;
Пока ЗначениеЗаполнено(ТекущийЭлемент) Цикл
Запрос.УстановитьПараметр("ТекущийЭлемент", ТекущийЭлемент);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Прервать;
КонецЕсли;
Выборка = Результат.Выбрать();
Выборка.Следующий();
Для НомерКолонки = 0 По Результат.Колонки.Количество() - 1 Цикл
ТекущийЭлемент = Выборка[НомерКолонки];
Если ЗначениеЗаполнено(ТекущийЭлемент) Тогда
РодителиЭлемента.Добавить(ТекущийЭлемент);
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат РодителиЭлемента;
КонецФункции
ред. 22 января 2021 22:54
ОповеститьОбИзменении(Тип("ДокументСсылка.РаботаВВыходныеИПраздничныеДни"));
ОповеститьОбИзменении(Тип("ДокументСсылка.РаботаВВыходныеИПраздничныеДни"));
ред. 20 января 2021 14:49
Функции СокрЛ, СокрП, СокрЛП удаляют любое количество пробелов в начале или конце строки. Этим можно воспользоваться, чтобы удалить другие начальные или конечные повторяющиеся символы, заменив их на пробел, а затем выполнив обратную замену.
//Например, чтобы удалить любое количество точек в конце строки, можно воспользоваться выражением:
СтрЗаменить(СокрП(СтрЗаменить(ИсходнаяСтрока, ".", " ")), " ", ".")
//Правда, если исходная строка изначально содержит пробелы, то результат будет неправильным. В этом случае предварительно требуется заменить пробелы каким-либо редким сочетанием символов, а после преобразования выполнить обратную замену.
СтрЗаменить(СтрЗаменить(СокрП(СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, " ", Символы.НПП), ".", " ")), " ", "."), Символы.НПП, " ")
//Например, чтобы удалить любое количество точек в конце строки, можно воспользоваться выражением:
СтрЗаменить(СокрП(СтрЗаменить(ИсходнаяСтрока, ".", " ")), " ", ".")
//Правда, если исходная строка изначально содержит пробелы, то результат будет неправильным. В этом случае предварительно требуется заменить пробелы каким-либо редким сочетанием символов, а после преобразования выполнить обратную замену.
СтрЗаменить(СтрЗаменить(СокрП(СтрЗаменить(СтрЗаменить(ИсходнаяСтрока, " ", Символы.НПП), ".", " ")), " ", "."), Символы.НПП, " ")
ред. 18 января 2021 10:26
Продукт представляет собой интегрированный в подсистему набор мощных инструментов разработчика на платформе 1С 8. Почти все они выполнены на обычных формах и потому работают только в толстых клиентах. Подсистема получила награду "Лучшая разработка" на конференции Infostart Event Evolution 2013.
Функция для определения вместимости текста в ячейку табличного документа
//Функция для определения вместится ли текст в ячейку:
//
// Параметры:
// пОбласть -Область табличного документа- Область табличного документа, которую надо проверить на вместимости.
// "пОбласть = пТабДок.Области.ТекстЗаготовки;". "ТекстЗаготовки" имя ячейки.
//
// Для возможности использования этого метода необходимо соблюдать следующие условия:
//
// пТабДок - Табличный документ - Табличный документ, в котором происходит проверка.
// "пТабДок = Макет.ПолучитьОбласть("ТекстЗаготовки");"
//
// пТекст - Строка - Проверяемый текст.
//
// 1. Необходимо как-нибудь назвать область.
// 2. Заполнение области = Текст, а не Параметр или Шаблон.
// Во всяком случае, я ничего простого не придумал. И так как жизнь это усложняет не сильно не стал заморачиваться из-за этого.
// 3. Размещение текста (Параметр ячейки) = Перенос. Вот это нужно обязательно! Размещение текста програмно поставить можно, но эффект от изменения,
// насколько я понял, появляется только после отображения табличного документа с этой ячейкой.
//
// Возвращаемое значение:
// Булево.
//
Функция ТекстУмещаетсяВЯчейке(пОбласть, пТабДок, пТекст) Экспорт
ВысотаДо = ВысотаОбластиВмм(пОбласть, пТабДок);
// Скопируем область в новый табличный документ.
// И там уже будем играть с её свойствами.
ВремТабДок = Новый ТабличныйДокумент;
ВремТабДок.Вывести(пТабДок);
ВремОбласть = ВремТабДок.Область(пОбласть.Имя);
ВремОбласть.АвтоВысотаСтроки = Истина;
ВремОбласть.ВысотаСтроки = 0;
ВремОбласть.Текст = пТекст + "Щ"; // Для исключения ситуаций вида "на грани переноса"
ВысотаПосле = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);
Возврат ВысотаДо >= ВысотаПосле;
КонецФункции
//Функция возвращает высоту области таб. документа в мм
//
// Параметры:
// пОбласть - Область табличного документа - Область табличного документа которую надо проверить.
//
// пТабДок - Табличный документ - Табличный документ, в котором происходит проверка.
//
// Возвращаемое значение:
// число.
//
Функция ВысотаОбластиВмм(пОбласть, пТабДок)
Надпись = пТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
Надпись.Расположить(пОбласть);
Высота = Надпись.Высота;
пТабДок.Рисунки.Удалить(Надпись);
Возврат(Высота);
КонецФункции
//Функция для определения вместится ли текст в ячейку:
//
// Параметры:
// пОбласть -Область табличного документа- Область табличного документа, которую надо проверить на вместимости.
// "пОбласть = пТабДок.Области.ТекстЗаготовки;". "ТекстЗаготовки" имя ячейки.
//
// Для возможности использования этого метода необходимо соблюдать следующие условия:
//
// пТабДок - Табличный документ - Табличный документ, в котором происходит проверка.
// "пТабДок = Макет.ПолучитьОбласть("ТекстЗаготовки");"
//
// пТекст - Строка - Проверяемый текст.
//
// 1. Необходимо как-нибудь назвать область.
// 2. Заполнение области = Текст, а не Параметр или Шаблон.
// Во всяком случае, я ничего простого не придумал. И так как жизнь это усложняет не сильно не стал заморачиваться из-за этого.
// 3. Размещение текста (Параметр ячейки) = Перенос. Вот это нужно обязательно! Размещение текста програмно поставить можно, но эффект от изменения,
// насколько я понял, появляется только после отображения табличного документа с этой ячейкой.
//
// Возвращаемое значение:
// Булево.
//
Функция ТекстУмещаетсяВЯчейке(пОбласть, пТабДок, пТекст) Экспорт
ВысотаДо = ВысотаОбластиВмм(пОбласть, пТабДок);
// Скопируем область в новый табличный документ.
// И там уже будем играть с её свойствами.
ВремТабДок = Новый ТабличныйДокумент;
ВремТабДок.Вывести(пТабДок);
ВремОбласть = ВремТабДок.Область(пОбласть.Имя);
ВремОбласть.АвтоВысотаСтроки = Истина;
ВремОбласть.ВысотаСтроки = 0;
ВремОбласть.Текст = пТекст + "Щ"; // Для исключения ситуаций вида "на грани переноса"
ВысотаПосле = ВысотаОбластиВмм(ВремОбласть, ВремТабДок);
Возврат ВысотаДо >= ВысотаПосле;
КонецФункции
//Функция возвращает высоту области таб. документа в мм
//
// Параметры:
// пОбласть - Область табличного документа - Область табличного документа которую надо проверить.
//
// пТабДок - Табличный документ - Табличный документ, в котором происходит проверка.
//
// Возвращаемое значение:
// число.
//
Функция ВысотаОбластиВмм(пОбласть, пТабДок)
Надпись = пТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст);
Надпись.Расположить(пОбласть);
Высота = Надпись.Высота;
пТабДок.Рисунки.Удалить(Надпись);
Возврат(Высота);
КонецФункции
ред. 14 января 2021 11:21
Научись создавать систему обмена сообщениями 1С RabbitMQ за 5 часов
-10%
1 500 руб.
1 350 руб.
Научись создавать систему обмена сообщениями для 1С на Apache Kafka за 5 часов
-10%
1 500 руб.
1 350 руб.
Возвращает массив символов препроцессора актуальных при вызове.
Функция может быть полезна в процессе изучения/освоения особенностей клиент-серверного взаимодействия.
<Символ препроцессора> = {НаКлиенте | НаСервере | ТолстыйКлиентОбычноеПриложение | ТолстыйКлиентУправляемоеПриложение | Клиент | Сервер | ВнешнееСоединение }
&НаКлиентеНаСервере
Функция АктуальныеСимволыПрепроцессора() Экспорт
Результат = новый Массив;
#Если НаКлиенте Тогда
Результат.Добавить("НаКлиенте");
#КонецЕсли
#Если НаСервере Тогда
Результат.Добавить("НаСервере");
#КонецЕсли
#Если Клиент Тогда
Результат.Добавить("Клиент");
#КонецЕсли
#Если Сервер Тогда
Результат.Добавить("Сервер");
#КонецЕсли
#Если МобильноеПриложениеКлиент Тогда
Результат.Добавить("МобильноеПриложениеКлиент");
#КонецЕсли
#Если МобильноеПриложениеСервер Тогда
Результат.Добавить("МобильноеПриложениеСервер");
#КонецЕсли
#Если МобильныйКлиент Тогда
Результат.Добавить("МобильныйКлиент");
#КонецЕсли
#Если ТолстыйКлиентОбычноеПриложение Тогда
Результат.Добавить("ТолстыйКлиентОбычноеПриложение");
#КонецЕсли
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Результат.Добавить("ТолстыйКлиентУправляемоеПриложение");
#КонецЕсли
#Если ВнешнееСоединение Тогда
Результат.Добавить("ВнешнееСоединение");
#КонецЕсли
#Если ТонкийКлиент Тогда
Результат.Добавить("ТонкийКлиент");
#КонецЕсли
#Если ВебКлиент Тогда
Результат.Добавить("ВебКлиент");
#КонецЕсли
Возврат Результат;
КонецФункции
&НаКлиентеНаСервере
Функция АктуальныеСимволыПрепроцессора() Экспорт
Результат = новый Массив;
#Если НаКлиенте Тогда
Результат.Добавить("НаКлиенте");
#КонецЕсли
#Если НаСервере Тогда
Результат.Добавить("НаСервере");
#КонецЕсли
#Если Клиент Тогда
Результат.Добавить("Клиент");
#КонецЕсли
#Если Сервер Тогда
Результат.Добавить("Сервер");
#КонецЕсли
#Если МобильноеПриложениеКлиент Тогда
Результат.Добавить("МобильноеПриложениеКлиент");
#КонецЕсли
#Если МобильноеПриложениеСервер Тогда
Результат.Добавить("МобильноеПриложениеСервер");
#КонецЕсли
#Если МобильныйКлиент Тогда
Результат.Добавить("МобильныйКлиент");
#КонецЕсли
#Если ТолстыйКлиентОбычноеПриложение Тогда
Результат.Добавить("ТолстыйКлиентОбычноеПриложение");
#КонецЕсли
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Результат.Добавить("ТолстыйКлиентУправляемоеПриложение");
#КонецЕсли
#Если ВнешнееСоединение Тогда
Результат.Добавить("ВнешнееСоединение");
#КонецЕсли
#Если ТонкийКлиент Тогда
Результат.Добавить("ТонкийКлиент");
#КонецЕсли
#Если ВебКлиент Тогда
Результат.Добавить("ВебКлиент");
#КонецЕсли
Возврат Результат;
КонецФункции
ред. 25 декабря 2020 14:31