arefaste/1C_Forums huggingface dataset:
Аналоги функций ДобавитьКДате и РазностьДат языка запросов
Теги: 1С

# Код реализации

```1c
//.
// Возвращаемое значение:
//   Структура - значения положительны для месячных типов и отрицательны для секундных
Функция МножителиТиповПериодов() Экспорт
	Сутки = 24*60*60;
	Множители = Новый Структура("Год, Полугодие, Квартал, Месяц,    Декада,   Неделя,     День,    Час, Минута, Секунда",
			                     12,          6,       3,     1, -10*Сутки, -7*Сутки, -1*Сутки, -60*60,    -60,      -1);
	Возврат Множители;
КонецФункции

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

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

# Примечания

- Сделано на основе https://fastcode.im/Templates/6833/dobavit-k-date-i-raznost-dat

- (1) tormozit, спасибо, очень не хватало этих функций
Форматирование строки JSON
Теги: 1С,JSON,Форматирование,1с8,Строка

Часто при работе с Интернет ресурсами в ответ приходит строка JSON в неформатированном виде. Хочется получить эту строку с отступами и другими прикрасами

# Код реализации

```1c
Функция ФорматироватьСтрокуJSON(СтрокаJSON, ПереносСтрокJSON, СимволыОтступа = " ", ИспользоватьДвойныеКавычки = Истина, ЭкранированиеСимволов = Неопределено)

	ЧтениеJSON = Новый ЧтениеJSON;
	ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
	Структура = ПрочитатьJSON(ЧтениеJSON, Ложь);

	ЗаписьJSON = Новый ЗаписьJSON;
	ПараметрыJSON = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON, СимволыОтступа, ИспользоватьДвойныеКавычки, ЭкранированиеСимволов);
	ЗаписьJSON.УстановитьСтроку(ПараметрыJSON);

	ЗаписатьJSON(ЗаписьJSON, Структура);

	СтрокаJSON = ЗаписьJSON.Закрыть();

	Возврат СтрокаJSON;

КонецФункции
```
Преобразование Строки в строку Base64
Теги: 1С,Преобразование,Base64,1c83,Строка

Иногда при работе с WEB сервисами возникает задача преобразовать строку в строку Base64

# Код реализации

```1c
Функция СтрокаBase64(Стр, Кодировка = Неопределено, ЗаписатьBOM = Ложь) Экспорт

	Если НЕ ЗначениеЗаполнено(Кодировка) Тогда
		Кодировка = КодировкаТекста.UTF8;
	КонецЕСли;

	ДвоичныеДанныеСтроки = ПолучитьДвоичныеДанныеИзСтроки(Стр, Кодировка, ЗаписатьBOM);
	Результат = Base64Строка(ДвоичныеДанныеСтроки);

	Возврат Результат;

КонецФункции
```
Проверка пересечения периодов (интервалов дат) в запросе
Теги: 1С,пересечение интервалов дат,Пересечение периодов

Функция для проверки, есть ли документы с тем же интервалом дат, что и заданный.

# Код реализации

```1c
//Истина - есть пересечения
//Ложь - пересечений нет.
Функция ЕстьПересечениеДат(НачалоПериода, КонецПериода)

	Запрос = Новый Запрос;
	Запрос.Текст =
		"ВЫБРАТЬ
		|	ВашДокумент.Ссылка
		|ИЗ
		|	Документ.ВашДокумент КАК ВашДокумент
		|ГДЕ
		|	ПлановыйГрафикРаботы.Проведен
		|	И &НачалоПериода < ВашДокумент.КонецПериода
		|			И &КонецПериода > ВашДокумент.НачалоПериода";

	Запрос.УстановитьПараметр("НачалоПериода", НачалоПериода);
	Запрос.УстановитьПараметр("КонецПериода", КонецПериода);

	РезультатЗапроса = Запрос.Выполнить();
	Возврат Не РезультатЗапроса.Пустой();

КонецФункции
```

# Примечания

- ПлановыйГрафикРаботы.Проведен нужно заменить на ВашДокумент.Проведен
Просклонять число лет
Теги: 1С,лет,год

Формирует строку типа: "1 год", "2 года", "5 лет", "14 лет", "21 год" и т.д.

# Код реализации

```1c
Функция ПросклонятьЧислоЛет(Знач ЧислоЛет)
   а = ПолучитьСклоненияСтрокиПоЧислу("год", ЧислоЛет, "",  "ЧС=Количественное", "ПД=Именительный")[0];
   Возврат СтрЗаменить(а,"годов","лет");
КонецФункции
```
Шаблон метода для заполнения Таблицы формы данными из СКД по макету
Теги: 1С,ТаблицаЗначений,Макет,ДеревоЗначений,СКД

Например, в обработку можно добавлять макеты СКД, и в обработке использовать их для заполнения Дерева или Таблицы значений

# Примечания

- Учел замечание в телеге (SAlx XLAS) и переделал в УстановитьЗначениеПараметра, но с учетом стандарта #std456.6.
Получить уровень вложенности дерева значений
Теги: 1С,ДеревоЗначений

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

# Код реализации

```1c
Функция ПолучитьМаксГлубинуДерева(ДеревоЗначений) Экспорт

   МаксГлубина = 0;
   Для Каждого Строка Из ДеревоЗначений.Строки Цикл
       МаксГлубина = Макс(МаксГлубина, РекурсивныйОбходДерева(Строка, 1));
   КонецЦикла;

   Возврат МаксГлубина;

КонецФункции

Функция РекурсивныйОбходДерева(Строка, ТекущаяГлубина)

   МаксГлубина = ТекущаяГлубина;
   Для Каждого ПодчиненнаяСтрока Из Строка.Строки Цикл
       МаксГлубина = Макс(МаксГлубина, РекурсивныйОбходДерева(ПодчиненнаяСтрока, ТекущаяГлубина + 1));
   КонецЦикла;

   Возврат МаксГлубина;

КонецФункции

// МаксГлубинаДерева = ПолучитьМаксГлубинуДерева(ДеревоЗначений);
```
Процедура Изобразить сканер штрих-кода
Теги: 1С,УТ,УТ11

Имитация события от сканера штрихкода для отладки.

# Код реализации

```1c
// Команда формы для вызова
&НаКлиенте
Процедура ИзобразитьСканерШК(Команда)

	ИзобразитьСканерШКДанныеВОсновных("68331545384715610814882357176103939876");

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

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

	ИмяСобытия = "ScanData";
	Источник = "ПодключаемоеОборудование";
	Параметр = Новый Массив;
	Параметр.Добавить(Данные);
	Параметр.Добавить(Неопределено);

	глПодключаемоеОборудованиеСобытиеОбработано = Ложь;

	Оповестить(ИмяСобытия, Параметр, Источник);

КонецПроцедуры
```
Создание команды
Теги: 1С,команда

# Код реализации

```1c
//Создание команды
	НоваяКоманда = ЭтаФорма.Команды.Добавить("ОбщаяКоманда");
	НоваяКоманда.Заголовок = "Общая команда";
	НоваяКоманда.Действие = "ОбщееДействие"; //указываем имя процедуры
```
Создание декорации картинки
Теги: 1С,Картинка,декорация

# Код реализации

```1c
	НовыйЭлемент = ЭтаФорма.Элементы.Добавить("КартинкаТовара", Тип("ДекорацияФормы"),СтраницаТовары);
	НовыйЭлемент.Вид = ВидДекорацииФормы.Картинка;
	НовыйЭлемент.Картинка = БиблиотекаКартинок.ГеографическаяСхема;
	НовыйЭлемент.РазмерКартинки = РазмерКартинки.Растянуть;
	НовыйЭлемент.Ширина = 20;
	НовыйЭлемент.Высота = 8;
```
Создание декорации надпись
Теги: 1С,надпись,декорация

# Код реализации

```1c
	НовыйЭлемент = ЭтаФорма.Элементы.Добавить("ИмяДекорации", Тип("ДекорацияФормы"),СтраницаТовары);
	НовыйЭлемент.Вид = ВидДекорацииФормы.Надпись;
	НовыйЭлемент.Заголовок = "ЗаголовокДляОтображения";
```
Создать группу формы
Теги: 1С,Группа форм,группа страниц

Создание различных групп формы

# Код реализации

```1c
	//Группы

	//Пример создания обычной группы без отображения
	ГруппаДатаНомер = ЭтаФорма.Элементы.Добавить("ГруппаОбычная", Тип("ГруппаФормы"),ЭтаФорма);
	ГруппаДатаНомер.Вид = ВидГруппыФормы.ОбычнаяГруппа;
	ГруппаДатаНомер.Отображение = ОтображениеОбычнойГруппы.Нет;
	ГруппаДатаНомер.ОтображатьЗаголовок = ЛОЖЬ;
	ГруппаДатаНомер.Группировка = ГруппировкаПодчиненныхЭлементовФормы.ГоризонтальнаяВсегда;

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

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

	//Пример создания страниц

	СтраницаТовары = ЭтаФорма.Элементы.Добавить("СтраницаТовары", Тип("ГруппаФормы"),ГруппаСтраниц);
	СтраницаТовары.Вид = ВидГруппыФормы.Страница;
	СтраницаТовары.Заголовок = "Товары";

	СтраницаДополнительно = ЭтаФорма.Элементы.Добавить("СтраницаДополнительно", Тип("ГруппаФормы"),ГруппаСтраниц);
	СтраницаДополнительно.Вид = ВидГруппыФормы.Страница;
	СтраницаДополнительно.Заголовок = "Дополнительно";
```
Программно создать новый реквизит
Теги: 1С,создание,реквизит

Создание нового реквизита программно

# Код реализации

```1c
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов

РеквизитКомментарий = Новый РеквизитФормы("Комментарий",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(500)));
ДобавляемыеРеквизиты.Добавить(РеквизитКомментарий );
НомерРеквизит = Новый РеквизитФормы("Номер",Новый ОписаниеТипов("Число",Новый КвалификаторыЧисла(10,0)));
ДобавляемыеРеквизиты.Добавить(НомерРеквизит);
ДатаРеквизит = Новый РеквизитФормы("Дата",Новый ОписаниеТипов("Дата",,,Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя)));
ДобавляемыеРеквизиты.Добавить(ДатаРеквизит);
НаименованиеРеквизит = Новый РеквизитФормы("Наименование",Новый ОписаниеТипов("Строка",,Новый КвалификаторыСтроки(150)));
ДобавляемыеРеквизиты.Добавить(НаименованиеРеквизит);

ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применяем реквизиты
```
Загрузка данных копипастом
Теги: 1С,ТаблицаЗначений,ТабличныйДокумент

Показываем пользователю табличный документ. Туда он может скопипастить данные откуда пожелает. Дальше следующие 3 строчки кода позволяют загрузить эти данные в таблицу значений

# Код реализации

```1c
Построитель = Новый ПостроительЗапроса;
Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабДок.Область());

ТабДанные = Построитель.Результат.Выгрузить();
```
Отбор при начале выбора Групп и элементов (УФ)
Теги: 1С,ВыборГруппИЭлементов,открытие формы,отбор

Пример кода открытия УФ с установкой Выбора Групп и элементов

# Код реализации

```1c
Процедура ОсновнаяТЗГруппаЦенНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("РежимВыбора",Истина);
    ПараметрыФормы.Вставить("МножественныйВыбор",Ложь);
    ПараметрыФормы.Вставить("ЗакрыватьПриВыборе",Истина);
    ПараметрыФормы.Вставить("ВыборГруппИЭлементов",ИспользованиеГруппИЭлементов.Группы);

	ОО = Новый ОписаниеОповещения("ПослеВыбораГруппыСкидок",ЭтаФорма);

    ОткрытьФорму("Справочник.СкидкиНаценки.ФормаВыбораГруппы",ПараметрыФормы,ЭтаФорма,,,,ОО);
КонецПроцедуры
```
Получение данных из буфера обмена
Теги: 1С,Буфер,ComОбъект,HTMLFILE

Получение данных из буфера

# Код реализации

```1c
Функция ПолучениеДанныхИзБуфера()
ТекстДанных = “”;
ОбъектВставки = Новый ComОбъект(“HTMLFILE”);
ТекстДанных = ОбъектВставки.ParentWindow.ClipboardData.GetData(“Text”);
Возврат ТекстДанных;
КонецФункции
```
Схема компоновки данных из запроса
Теги: 1С,Запрос,СхемаКомпоновкиДанных,Желтый Чайник 1С,СКД

Возвращает схему компоновки данных на основе текста запроса и параметров

# Код реализации

```1c
// Схема компоновки данных из запроса.
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/160
//
// Параметры:
//  ТекстЗапроса - Строка
//  ПараметрыЗапроса - Структура
//
// Возвращаемое значение:
//  СхемаКомпоновкиДанных
//
// Пример:
//  СКД = СхемаКомпоновкиДанныхИзЗапроса("ВЫБРАТЬ * ИЗ Справочник.Валюты");
//
Функция СхемаКомпоновкиДанныхИзЗапроса(ТекстЗапроса, ПараметрыЗапроса = Неопределено) Экспорт

	СхемаКомпоновкиДанных = Новый СхемаКомпоновкиДанных();

	ИсточникДанных = СхемаКомпоновкиДанных.ИсточникиДанных.Добавить();
	ИсточникДанных.Имя = "ЛокальнаяБаза";
	ИсточникДанных.СтрокаСоединения = "";
	ИсточникДанных.ТипИсточникаДанных = "Local";

	НаборДанных = СхемаКомпоновкиДанных.НаборыДанных.Добавить(Тип("НаборДанныхЗапросСхемыКомпоновкиДанных"));
	НаборДанных.АвтоЗаполнениеДоступныхПолей = Истина;
	НаборДанных.Запрос = ТекстЗапроса;
	НаборДанных.Имя = "Запрос";
	НаборДанных.ИсточникДанных = ИсточникДанных.Имя;

	Если ЗначениеЗаполнено(ПараметрыЗапроса) Тогда
		Для Каждого КлючИЗначение Из ПараметрыЗапроса Цикл
			ПараметрЗапроса = СхемаКомпоновкиДанных.Параметры.Добавить();
			ПараметрЗапроса.Имя = КлючИЗначение.Ключ;
			ПараметрЗапроса.Значение = КлючИЗначение.Значение;
			ПараметрЗапроса.ОграничениеИспользования = Истина;
			ПараметрЗапроса.Использование = ИспользованиеПараметраКомпоновкиДанных.Всегда;
		КонецЦикла;
	КонецЕсли;

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

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

	Для Каждого Параметр Из КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы Цикл
		ИмяПараметра = Строка(Параметр.Параметр);
		Если СхемаКомпоновкиДанных.Параметры.Найти(ИмяПараметра) = Неопределено Тогда
			ПараметрСКД = СхемаКомпоновкиДанных.Параметры.Добавить();
			ПараметрСКД.Имя = ИмяПараметра;
			ПараметрСКД.Использование = ИспользованиеПараметраКомпоновкиДанных.Авто;
		КонецЕсли;
	КонецЦикла;

	ДетальныеЗаписи = СхемаКомпоновкиДанных.НастройкиПоУмолчанию.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
	ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));

	Возврат СхемаКомпоновкиДанных;

КонецФункции
```
Шаблон внешней печатной формы на БСП с назначением
Теги: 1С,Печатная форма,БСП,Внешняя печатная форма,Печать

Коллеги, много видел тут шаблонов, но мне ни один не подошел. Пришлось писать свой, которым я решил поделиться. Версию БСП можете указывать свою, на версиях ниже не тестировалось. Отличительная особенность в возможности печати по-комплектно. Комментарии в коде писать не стал, и так всё интуитивно понятно.
Это ошибка существования метода.
Теги: 1С,Желтый Чайник 1С

Метод проверяет является ли это ошибкой существования метода

# Код реализации

```1c
// Это ошибка существования метода.
// Источник: https://github.com/SeiOkami/CollectionMethodsOneS/issues/158
//
// Параметры:
//  ИнформацияОбОшибке - ИнформацияОбОшибке
//  ИмяМетода - Строка
//  ПроверятьНаНеобъектныйТип - Булево - Если Истина, то ошибка "Значение не является объектного типа" тоже считается за ошибку отстуствия типа
//
// Возвращаемое значение:
//  Булево
//
// Пример:
//
//  Попытка
//      Объект.НеобязательныйМетод();
//  Исключение
//      Если НЕ ЭтоОшибкаСуществованияМетода(ИнформацияОбОшибке(), "НеобязательныйМетод") Тогда
//          ВызватьИсключение;
//      КонецЕсли;
//  КонецПопытки;
//
Функция ЭтоОшибкаСуществованияМетода(ИнформацияОбОшибке,
	ИмяМетода, ПроверятьНаНеобъектныйТип = Истина) Экспорт

	ОписаниеОшибки = ИнформацияОбОшибке.Описание;

	ВременныеОбъекты = Новый Массив; //Массив из Неопределено
	ВременныеОбъекты.Добавить(Новый Структура);

	Если ПроверятьНаНеобъектныйТип Тогда
		ВременныеОбъекты.Добавить();
	КонецЕсли;

	Для Каждого ВременныйОбъект Из ВременныеОбъекты Цикл

		Попытка
			ВременныйОбъект.СуперПуперМетод(); //@skip-check dynamic-access-method-not-found
		Исключение
			ВременноеОписание = СтрЗаменить(ИнформацияОбОшибке().Описание, "СуперПуперМетод", ИмяМетода);
			Если ОписаниеОшибки = ВременноеОписание Тогда
				Возврат Истина;
			КонецЕсли;
		КонецПопытки;

	КонецЦикла;

	Возврат Ложь;

КонецФункции
```
Определние ПустаяСсылка в Запросе
Теги: 1С,Пустая ссылка,Запрос

Часто в Запросе требуется проверить заполнение реквизита типа Справочник, Документ, Перечисление или другого ссылочного типа на заполненность.

# Код реализации

```1c
//	ВидМаркированнойПродукции = Перечисление.ВидыМаркируемойПродукции
//      Выбираем элементы справочника Номенклатура
//      Где заполнен реквизит "ВидМаркированнойПродукции"

Запрос = Новый Запрос;

	ТекстЗапроса = "
		|ВЫБРАТЬ
		|	Спр.Ссылка,
		|	Спр.ВидМаркированнойПродукции
		|ИЗ
		|	Справочник.Номенклатура КАК Спр
		|
		|ГДЕ
		|	НЕ Спр.ВидМаркированнойПродукции.ССылка is NULL
		|";

	Запрос.Текст = ТекстЗапроса;

	Выборка = Запрос.Выполнить().Выбрать();
```

# Примечания

- Еще можно так написать:
Есть Не Null

- В приведенном запросе выполняется проверка не на заполненность, а на отсутствие строки в таблице по ссылке. Для битой ссылки она тоже сработает. Хотя она не является не заполненной.

- Я бы написал
НЕ Спр.ВидМаркированнойПродукции.ССылка = Значение(Справочник.ВидыМаркированнойПродукции.ПустаяСсылка)

- (3) Евгений В, Спр.ВидМаркированнойПродукции.ССылка = Значение(Справочник.ВидыМаркированнойПродукции.ПустаяСсылка)
и
Спр.ВидМаркированнойПродукции.ССылка is NULL
это две разных ситуации.
при этом надо понимать если Спр.ВидМаркированнойПродукции.ССылка равно Null , то первое условие дает Ложь.
И конечно хотелось бы увидеть когда Спр.Ссылка is  NULL. В данном запросе это возможно?
Меню обработки дополнительной расшифровки в табличном документе (не СКД)
Теги: 1С,ТабличныйДокумент,ОбработкаДополнительнойРасшифровки,Меню,Расшифровка,ОбработкаРасшифровки

Пример работы с расшифровкой и дополнительной расшифровкой. Выводит меню (контекстное по правой кнопке мыши) для дополнительной расшифровки табличного документа.
Свернуть таблицу значений на клиенте (ДанныеФормыЗначение)
Теги: 1С

Сворачивает реквизит формы типа "ТаблицаЗначений" на клиенте.

# Примечания

- тут бы неплохо задуматься над тем, что при обходе на клиенте могут происходить неявные серверные вызовы. https://its.1c.ru/db/v8std#content:628:hdoc
Преобразование Хранилище Значения в Двоичные данные и обратно
Теги: 1С,Преобразование,ДвоичныеДанные,1с8,ХранилищеЗначения

При обмене данными через WEB сервисы иногда возникает задача передавать данные в сжатом виде. Для этого лучше всего использовать объект 1С ХранилищеЗначения. Тут возникает проблема преобразования ХранилищаЗначения в ДвоичныеДанные и обратно. Внятного алгоритма реализации этого алгоритма 1С не предоставляет.

# Код реализации

```1c
Процедура КнопкаТестироватьХранилищеЗначенияНажатие(Элемент)

	СтрокаJSON = "Строка для преобразования";

	//Преобразуем Строку в Хранилище значения со сжатием.
	СжатиеДанных = Новый СжатиеДанных(9);
	ХранилищеЗначения = Новый ХранилищеЗначения(СтрокаJSON,СжатиеДанных);

	//Преобразуем Хранилище Значения в Двоичные данные
	СтрBase64 = XMLСтрока(ХранилищеЗначения);
	ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(СтрBase64,"UTF-8", Ложь);


	//Преобразуем Двоичные данные в Хранилище значений
	РезультатСтрBase64 = ПолучитьСтрокуИзДвоичныхДанных(ДвоичныеДанные,"UTF-8");
	РезультатХранилище = XMLЗначение(Тип("ХранилищеЗначения"), РезультатСтрBase64);

	//Получим строку из Хранилища
	СтрокаJSONизХранилища = РезультатХранилище.Получить();


КонецПроцедуры
```
Локализация объекта по уникальному значению свойства
Теги: 1С,вдв

# Код реализации

```1c
&НаСервере
Процедура ПримерПолученияОбъекта(УИД) Экспорт
	НужныйОбъект = ПолучитьОбъектПоЗначениюСвойства("УИД_НашегоДокумента", УИД, "Документ.ЗаказКлиента");
КонецПроцедуры

&НаСервере
// Универсальная функция. Получает объект определенного типа по уникальному значению свойства.
// Свойство - Либо свойство (ПланВидовХарактеристик.ДополнительныеРеквизитыИСведения), либо Имя (строка)
// ЗначениеСвойства - значение, передаваемое для поиска объекта.
// ИмяМетаданные - Имя метаданных ("Документ.ЗаказКлиента"). Сильно ускоряет запрос.
Функция ПолучитьОбъектПоЗначениюСвойства(Свойство_Или_Имя, ЗначениеСвойства, ИмяМетаданные) Экспорт

	Ответ = Неопределено;

	Если ТипЗнч(Свойство_Или_Имя) = Тип("Строка") Тогда
		Свойство = ПолучитьСоздатьСвойство(Свойство_Или_Имя);
	Иначе
		Свойство = Свойство_Или_Имя;
	КонецЕсли;

	Если Не Свойство = Неопределено Тогда

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


		Запрос.Текст = СтрЗаменить(Запрос.Текст, "Справочник.Номенклатура", ИмяМетаданные);

		Запрос.УстановитьПараметр("Свойство", Свойство);
		Запрос.УстановитьПараметр("ЗначениеСвойства", ЗначениеСвойства);
		Выборка = Запрос.Выполнить().Выбрать();
		Если Выборка.Следующий() Тогда
			Ответ = Выборка.Объект;
		КонецЕсли;

	КонецЕсли;

	Возврат Ответ;

КонецФункции
```

# Примечания

- Функция ПолучитьСоздатьСвойство(), которая используется в шаблоне:
https://fastcode.im/Templates/10022/poluchit-svojstvo-po-imeni-sozdat-ego-pri-otsutstvii
Получить имя базы 1С
Теги: 1С,Имя базы

# Код реализации

```1c
ИмяБазы = Макс(НСтр(СтрокаСоединенияИнформационнойБазы(),"Ref"),НСтр(СтрокаСоединенияИнформационнойБазы(),"File"));
```
Выполнить запрос в другой базе
Теги: 1С

hsИнтегратор

# Код реализации

```1c
структРезультат = hsИнтегратор.ВыполнитьУдаленныйЗапросБД(ТекстЗапроса, Параметры, ВебНазвание);

СтрОшибка = hsИнтегратор.ОшибкаВРезультате;
Если Не ПустаяСтрока(СтрОшибка) Тогда
	ВызватьИсключение ("" + СтрОшибка);
КонецЕсли;
```
Запись текста в кодировке UTF-8 без BOM средствами платформы 1С
Теги: 1С,BOM

КодировкаТекста.CESU-8 - для 1C - это аналог UTF-8 без BOM

# Код реализации

```1c
ЗТ = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.ANSI);
ЗТ.Закрыть();
ЗТ = Новый ЗаписьТекста(ИмяФайла,,, Истина, Символы.ПС);
ЗТ.Записать(Данные);
ЗТ.Закрыть();

//--------------------

ЗТ = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.CESU-8);
ЗТ.Записать(Данные);
ЗТ.Закрыть();
```
Високосный ли год?
Теги: 1С,високосный,год,григорианский,календарь

Полное правило для определения високосного года по григорианскому календарю

# Код реализации

```1c
Функция Високосный(Год) Экспорт

	Если Год % 400 = 0 Тогда
		Возврат Истина;

	ИначеЕсли Год % 100 = 0 Тогда
		Возврат Ложь;

	ИначеЕсли Год % 4 = 0 Тогда
		Возврат Истина;
	Иначе
		Возврат Ложь;
	КонецЕсли;

КонецФункции
```

# Примечания

- Сообщить(?(День(КонецМесяца(Дата("20240211"))) = 29, истина, ложь));

- (1) Дмитрий Михайлович Попов, Сообщить(?(День(КонецМесяца(Дата(Год(ТекущаяДата()), 2,1))) = 29, истина, ложь));