arefaste/1C_Forums huggingface dataset:
Дублирование тегов
Теги: 1С,FastCode,Баги

# Примечания

- Можете скришнот приложить? Где дублируются?

- Достаточно просто перейти в раздел "Теги", они сильно далеко друг от друга скринить не удобно, потому только такой пример

- (2) Эльдар Мингалиев, да, вижу дубли, исправлю. Спасибо!

- (2) Эльдар Мингалиев, вроде исправил, можете проверить как сейчас?

- (4) еще остались

- (5) Эльдар Мингалиев, дубли убрал. Заодно добавил новые предопределенные теги.
Программное получение СочетаниеКлавиш
Теги: 1С,Хуки1с,СочетаниеКлавиш

Дает возможность назначить нестандартные кнопки - например Enter(13) , Esc(27), Del(46) и т.д.

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

```1c
// Возвращает сочетание клавиш из скан-кода
//
// Параметры:
//  Код - Строка - скан-код клавиши
//  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 - скан-коды клавиатуры
```
Установить отбор пользовательских настроек динамического списка
Теги: 1С,СКД,БСП,УФ

Установка отбора списка при программном открытии управляемой формы списка. Помогает в тех случаях, если нужно установить значение отбора, которое потом может быть отредактировано пользователем. Если устанавливать отбор через параметры открытия формы, то отбор добавляется в фиксированные настройки компоновки и при изменении этого отбора пользователем на форме возникнет ошибка

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

```1c
//Если есть БСП
мФорма = ОткрытьФорму("Справочник.Номенклатура.ФормаСписка");

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

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


&НаКлиенте
Процедура УстановитьПользовательскийОтборДинамическогоСписка(Список, ИмяПоля, Значение, ВидСравнения);

	Для Каждого ЭлементОтбора Из Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл

		Если ТипЗнч(ЭлементОтбора) = Тип("ОтборКомпоновкиДанных") Тогда

			ПользовательскийОтбор = ЭлементОтбора.Элементы;

			НовыйЭлементОтбора = Неопределено;

			Для Каждого СуществующийЭлементОтбора Из ПользовательскийОтбор Цикл

				Если СуществующийЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля) Тогда

					НовыйЭлементОтбора = СуществующийЭлементОтбора;

					 Прервать;

				КонецЕсли;

			КонецЦикла;

			Если СуществующийЭлементОтбора = Неопределено Тогда

				НовыйЭлементОтбора = ПользовательскийОтбор.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));

				НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля);

			КонецЕсли;

			НовыйЭлементОтбора.ВидСравнения = ВидСравнения;
			НовыйЭлементОтбора.Использование = Истина;
			НовыйЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный;
			НовыйЭлементОтбора.ПравоеЗначение = Значение;

		КонецЕсли;

	КонецЦикла;

КонецПроцедуры;
```
Отслеживание изменений отбора
Теги: 1С,Отбор

изменение отбора, обработчик изменения отбора

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

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

	ОбработкаОтбора(Неопределено);
КонецПроцедуры

Процедура ОбработкаОтбора(Элемент)

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

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

Альтернатива странному методу ЗагрузитьКолонку объектов типа ТаблицаЗначений, ТабличнаяЧасть

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

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


    МаксимальныйИндексТаблицы = Таблица.Количество() - 1;
    МаксимальныйИндексМассива = МассивЗначений.Количество() - 1;

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

КонецПроцедуры
```
Оформление (раскраска) строки табличной части обычной формы по условию, при получении данных
Теги: 1С,Обычные формы

Событие ПриПолученииДанных используется для оформления ячеек строк данных, отображаемых табличным полем. В нем можно оформить или раскрасить строку, в зависимости от данных.

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

```1c
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)

	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл

		Если ОформлениеСтроки.ДанныеСтроки.Товар.Уценен Тогда
			ОформлениеСтроки.Ячейки.Комментарий.УстановитьТекст("Уценка");
			ОформлениеСтроки.Ячейки.Комментарий.ЦветФона = Новый Цвет(255, 255, 128);
			ОформлениеСтроки.Ячейки.Комментарий.ЦветТекста = Новый Цвет(0, 0, 0);
			ОформлениеСтроки.Ячейки.Комментарий.ТолькоПросмотр = Истина;
		КонецЕсли;

		//ОформлениеСтроки.ЦветФона = Новый Цвет(255, 255, 128);
		//ОформлениеСтроки.ЦветТекста = Новый Цвет(0, 0, 0);

	КонецЦикла;

КонецПроцедуры
```
МассивБезДублей
Теги: 1С,Дубли,Массив

Убирает дубли из массива значений

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

```1c
Функция МассивБезДублей(ИсходныйМассив) Экспорт

	Результат = Новый Массив;

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

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

КонецФункции // МассивБезДублей()
```

# Примечания

- А чем не устраивают методы БСП?

- (1) Borzyj, на больших данных работает гораздо быстрее чем перебор.
МассивВТаблицуЗначений
Теги: 1С,ТаблицуЗначений,Массив

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

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

```1c
Функция МассивВТаблицуЗначений(ИсходныйМассив, Знач ИмяКолонки="") Экспорт

	Если ПустаяСтрока(ИмяКолонки) Тогда
		ИмяКолонки = "Колонка1";
	КонецЕсли;

	ИмяКолонки = СтрЗаменить(ИмяКолонки, " ", "_");

	Результат = Новый ТаблицаЗначений;
	Результат.Колонки.Добавить(ИмяКолонки);

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

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

КонецФункции // МассивВТаблицуЗначений()
```
Печать из "вне" ссылки в файл
Теги: 1С

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

```1c
ФорматыПечати = Новый Массив;
ФорматыПечати.Добавить(ТипФайлаТабличногоДокумента.DOCX);
КомандыПечати = УправлениеПечатью.КомандыПечатиФормы("Документ.Отпуск.Форма.ФормаДокумента").НайтиСтроки(Новый Структура("Представление", ПредставлениеПФ));
НастройкиСохранения = УправлениеПечатью.НастройкиСохранения();
НастройкиСохранения.ФорматыСохранения = ФорматыПечати;
НастройкиСохранения.ПодписьИПечать = Истина;

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

ТаблицаЗначенийПФ = УправлениеПечатью.НапечататьВФайл(КомандыПечати, СписокОбъектов, НастройкиСохранения);
```
Пример работы с OpenOffice/LibreOffice Calc
Теги: 1С,Загрузка,OpenOffice,Calc,Таблица

# Примечания

- На Инфостарте масса примеров:

1С 8: Работаем с файлами MS Excel, используя OpenOffice/LibreOffice
Общий модуль для разработки несложных отчетов в формате OpenOffice
Загрузка из EXCEL в 1С. com.sun.star.ServiceManager (LibreOffice/OpenOffice)

- Ну и на закуску, моя обработка, немного покрывшаяся мхом: Обработка файлов OpenOffice Calc без установленного OpenOffice и ВК Я к сожалению давно её не обновлял и не дорабатывал и не поправлял мелкие баги, но вдруг будет полезно.
Открыть форму незаписанного документа
Теги: 1С,Документы,Незаписанный,ОткрытьФорму

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

```1c
&НаКлиенте
Процедура Команда(Команда)

Форма = ПолучитьФорму("Документ.НашДокумент.ФормаОбъекта");
ДанныеФормы = Форма.Объект; // Получаем объект формы в переменную
ЗаполнитьДокументНаСервере(ДанныеФормы); // Заполняем документ на сервере
КопироватьДанныеФормы(ДанныеФормы, Форма.Объект); // копируем наш объект в объект формы и далее открываем ее
Форма.Открыть();

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

// Можно использовать безконтекстный вызов, оптимизируем передачу данных

&НаСервереБезКонтекста

Функция ЗаполнитьДокументНаСервере(ДанныеФормы);

Док = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.НашДокумент")); // Получаем объект из данных формы ИЛИ

Док = Документы.НашДокумент.СоздатьДокумент();

// Заполняем реквизиты объекта или другие действия ********

ЗначениеВДанныеФормы(Док,ДанныеФормы); // Кладем обратно в объект формы уже созданный документ

КонецФункции
```
Как удалить префикс и лидирующие нули?
Теги: 1С

# Примечания

- Процедура ОбработатьНомерДокумента()

       НомерБезПрефикса = Объект.ВходящийНомер; 
       Пока Найти(НомерБезПрефикса,"0") <> 1 Цикл
               НомерБезПрефикса = Сред(НомерБезПрефикса,2); //удаляет лидирующие ненули
       КонецЦикла;

       НомерБезНулей = НомерБезПрефикса;
       Пока Найти(НомерБезНулей,"0") = 1 Цикл
                НомерБезНулей = Сред(НомерБезНулей,2); //удаляет лидирующие нули
       КонецЦикла;
       Объект.ОбработанныйНомер = НомерБезНулей;

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

- Не сработает, если номер забил все 0, например ПФ-12345678

- Сработает, если префикс определять по символу "-", а не "0"

- Тогда уж так наверное:
Пока Найти("0123456789", Лев(НомерБезПрефикса, 1)) = 0 Цикл
		НомерБезПрефикса = Сред(НомерБезПрефикса, 2); //удаляет лидирующие ненули
	КонецЦикла;
	НомерБезНулей = НомерБезПрефикса;
	Пока Найти(НомерБезНулей, "0") = 1 Цикл
		НомерБезНулей = Сред(НомерБезНулей,2); //удаляет лидирующие нули
	КонецЦикла;

- Автор: ildarovich
Первый вариант:
Функция ЧислоСправа(Стр, К = 0)
   Возврат ?(Цел(КодСимвола(Прав("!" + Стр, К + 1)) / 5 - 10.5), Формат(Число("0" + Прав(Стр, К)), "ЧГ="), ЧислоСправа(Стр, К + 1))
КонецФункции

Второй вариант:
Функция ЧислоСправа1(Номер)
   Возврат Формат(Число("0" + Сред(Номер, СтрДлина(СокрП(
   СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Номер
   , "0", " "), "1", " "), "2", " "), "3", " "), "4", " "), "5", " "), "6", " "), "7", " "), "8", " "), "9", " "))) + 1)), "ЧГ=")
КонецФункции
Добавить элемент в обычную форму
Теги: 1С,Форма

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

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

```1c
ПолеВвода = ЭлементыФормы.Добавить(Тип("ПолеВвода"), <НаименованиеЭлемента>, Истина, <Панель>);
ПолеВвода.Данные = <ПутьКДанным>;
ПолеВвода.Верх = <Верх>;
ПолеВвода.Высота = <Высота>;
ПолеВвода.Лево = <Лево>;
ПолеВвода.Ширина = <Ширина>;
ПолеВвода.УстановитьПривязку(ГраницаЭлементаУправления.Лево, <КкомуПривязываемся>, <ККакойЕгоГранице>);
ПолеВвода.УстановитьПривязку(ГраницаЭлементаУправления.Право, <КкомуПривязываемся>, <ККакойЕгоГранице>);
ПолеВвода.УстановитьПривязку(ГраницаЭлементаУправления.Верх, <КкомуПривязываемся>, <ККакойЕгоГранице>);
ПолеВвода.УстановитьПривязку(ГраницаЭлементаУправления.Низ, <КкомуПривязываемся>, <ККакойЕгоГранице>);
```
Запись в регистр сведений (периодический, независимый)
Теги: 1С,Регистр сведений

Запись в регистр сведений (периодический, независимый)

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

```1c
МенеджерЗаписи = РегистрыСведений.УчетНомернойНоменклатуры.СоздатьМенеджерЗаписи();
		Пока Выборка.Следующий() Цикл
			Если Выборка.Номенклатура.Номерная Тогда
				МенеджерЗаписи.Период 		= Дата;
				МенеджерЗаписи.Место 		= Склад;
				МенеджерЗаписи.Номенклатура = Выборка.Номенклатура;
				МенеджерЗаписи.Номер 		= Выборка.НомерАгрегата;
				МенеджерЗаписи.Статус 		= Перечисления.СтатусНоменклатуры.НаСкладе;
				МенеджерЗаписи.Записать();
			КонецЕсли;
		КонецЦикла;
```

# Примечания

- В регистр пишется только последняя запись, а не вся выборка
Проверка Модифицированности объекта
Теги: 1С,Изменен,Объект,Определить,Найти,Модифицирован

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

```1c
Функция ОбъектМодифицирован(Объект, ПроверятьТабличныеЧасти = Истина, ПроверятьСтандартные = Истина) Экспорт

    Ссылка = Объект.Ссылка;
    МетаданныеОбъекта = Ссылка.Метаданные();

    Для каждого Реквизит Из МетаданныеОбъекта.Реквизиты Цикл
    Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
            Возврат Истина;
        КонецЕсли;
    КонецЦикла;

    Если ПроверятьСтандартные Тогда
        Для каждого Реквизит Из МетаданныеОбъекта.СтандартныеРеквизиты Цикл
            Если Объект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда
                Возврат Истина;
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

    Если ПроверятьТабличныеЧасти Тогда
        Для каждого ТЧ Из МетаданныеОбъекта.ТабличныеЧасти Цикл

            Если Объект[ТЧ.Имя].Количество() <> Ссылка[ТЧ.Имя].Количество() Тогда
        Возврат Истина;
            КонецЕсли;

            Для Индекс = 0 По Объект[ТЧ.Имя].Количество()-1 Цикл
                ОбъектСтрокаТЧ = Объект[ТЧ.Имя][Индекс];
                СсылкаСтрокаТЧ = Ссылка[ТЧ.Имя][Индекс];
                Для каждого РеквизитТЧ Из ТЧ.Реквизиты Цикл
                    Если ОбъектСтрокаТЧ[РеквизитТЧ.Имя] <> СсылкаСтрокаТЧ[РеквизитТЧ.Имя] Тогда
                        Возврат Истина;
                    КонецЕсли;
                КонецЦикла;
            КонецЦикла;

        КонецЦикла;
    КонецЕсли;

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

КонецФункции
```
Конвертация даты из формата ISO8601 в дату 1С с учетом миллисекунд
Теги: 1С,Обмен,ISO8601,Дата

Возвращает структуру с полями "Дата" и "Миллисекунды", стандартный способ преобразования даты округляет время, а в некоторых случаях важна особая точность

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

```1c
Функция КонвертироватьДатуISO8601ВДату(Дата) Экспорт

	КонвертированнаяДата = Новый Структура("Дата, Миллисекунды");

	АвтоконвертированнаяДата = XMLЗначение(Тип("Дата"), Дата);

	Миллисекунды = Сред(Дата, 21);
	Миллисекунды = СокрЛП(СтрЗаменить(Миллисекунды, "Z", ""));

	Если НЕ ПустаяСтрока(Миллисекунды) Тогда

		ЧислоМиллисекунд = Число(Миллисекунды);

		Если ЧислоМиллисекунд >= 500 Тогда

			АвтоконвертированнаяДата = АвтоконвертированнаяДата - 1;

		КонецЕсли;

	КонецЕсли;

	КонвертированнаяДата.Дата = АвтоконвертированнаяДата;

	КонвертированнаяДата.Миллисекунды = Миллисекунды;

	Возврат КонвертированнаяДата;

КонецФункции
```
Удалить дубли строк в таблице значений
Теги: 1С,ТаблицаЗначений,Таблица значений

Удаляет дубли строк таблицы по указанным колонкам, если не указано, то ищет дубли во всем.

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

```1c
Функция УдалитьДублиСтрокТаблицыЗначений(Таблица, Колонки = "") Экспорт

	Если ПустаяСтрока(Колонки) Тогда

		// Просто свернем таблицу по всем колонкам

		Для каждого Колонка Из Таблица.Колонки Цикл
			Колонки = Колонки + ?(ПустаяСтрока(Колонки), "", ",") + Колонка.Имя;
		КонецЦикла;

		ТаблицаРезультат = Таблица.Скопировать();
		ТаблицаРезультат.Свернуть(Колонки);

	Иначе

		КолонкиЗапроса = "ТЗ." + СтрЗаменить(Колонки, ",", ",ТЗ.");

		Запрос = Новый Запрос;
		Запрос.Текст = "ВЫБРАТЬ
					   |	" + КолонкиЗапроса + "
					   |ПОМЕСТИТЬ ВТ_ТЗ
					   |ИЗ
					   |	&ТЗ КАК ТЗ
					   |;
					   |
					   |////////////////////////////////////////////////////////////////////////////////
					   |ВЫБРАТЬ РАЗЛИЧНЫЕ
					   |	" + СтрЗаменить(КолонкиЗапроса, "ТЗ.", "ВТ_ТЗ.") + "
					   |ИЗ
					   |	ВТ_ТЗ КАК ВТ_ТЗ
					   |";

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

			СтруктураОтбора = Новый Структура(Колонки);
			ЗаполнитьЗначенияСвойств(СтруктураОтбора, СтрокаТЗ);

			РезультатОтбора = Таблица.НайтиСтроки(СтруктураОтбора);
			Для каждого СтрокаОтбора Из РезультатОтбора Цикл

				НоваяСтрока = ТаблицаРезультат.Добавить();
				ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаОтбора);
				Прервать;

			КонецЦикла;

		КонецЦикла;

	КонецЕсли;

	Возврат ТаблицаРезультат;

КонецФункции // УдалитьДублиСтрокТаблицыЗначений()
```
ЗаписьJSON
Теги: 1С,JSON,ЗаписьJSON

Формирует строку со структурой JSON без создания файла

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

```1c
	ЗаписьJSON = Новый ЗаписьJSON;

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

	ЗаписьJSON.ЗаписатьНачалоОбъекта();
		ЗаписьJSON.ЗаписатьИмяСвойства("Выражение");
		ЗаписьJSON.ЗаписатьЗначение("Сумма 1 + 1");
		ЗаписьJSON.ЗаписатьИмяСвойства("Результат");
		ЗаписьJSON.ЗаписатьЗначение(2);
	ЗаписьJSON.ЗаписатьКонецОбъекта();

	ТелоЗапроса = ЗаписьJSON.Закрыть();
```

# Примечания

- Так не прощще?
J=Новый ЗаписьJSON;
J.УстановитьСтроку();
ЗаписатьJSON(J,Новый Структура("Выражение,Результат","Сумма 1 + 1",2));
Телозапроса=J.Закрыть();

- (1) AlexXJ, Проще чем? Количеством набираемых букв? Я же не в блокноте пишу.

- (2) Bezeus, видимо прщеттем, что за перевод ключа и свойства в json файл отвечает внутренняя 1С функция конвертации. Это позволяет уменьшить вероятность ошибки из-за неправильной вставки ключа или значения. Например забыть вставить ключ или случайно дважды в один ключ вставит значения.

- (2) Bezeus, проще тем, можно просто создать массив структур и разом запихнуть все это в JSON, парсером 1с. Ну и количество букв разумеется.
Заполнить реквизит "СуммаДокумента "на форме документа
Теги: 1С,Реквизит,Табличная часть

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

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

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

```1c
&НаКлиенте
Процедура ТоварыЦенаПриИзменении(Элемент)
	РассчитатьСумму();
КонецПроцедуры

&НаКлиенте
Процедура РассчитатьСумму()
	Стр = Элементы.Товары.ТекущиеДанные;
	Стр.Сумма = Стр.Цена * Стр.Количество;
КонецПроцедуры
```
IP-адрес локального компьютера
Теги: 1С

Узнать IP адрес локального компьютера

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

```1c
&НаКлиенте
Процедура УзнатьIP(Команда)

	COMОбъект1 = Новый COMОбъект("WbemScripting.SWbemLocator");
	COMОбъект2 = COMОбъект1.ConnectServer(".","root\CIMV2");

	Результат = COMОбъект2.ExecQuery("SELECT IPAddress FROM
	|Win32_NetworkAdapterConfiguration
	|WHERE IPEnabled = TRUE");

	Для каждого Строка Из Результат Цикл
		Для каждого ПодСтрока Из Строка.IPAddress Цикл
			Стр = Объект.IPAddress.Добавить();
			Стр.Адрес = ПодСтрока;
			//Сообщить(ПодСтрока);
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры
```
Пересчет сумм в табличной части документа
Теги: 1С

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

```1c
НА СЕРВЕРЕ:

СтруктураПересчетаСуммы = ОбработкаТабличнойЧастиКлиентСервер.ПараметрыПересчетаСуммыНДСВСтрокеТЧ(ДокЗаказ);
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьСумму", "КоличествоУпаковок");
СтруктураДействий.Вставить("ПересчитатьСуммуНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуСНДС", СтруктураПересчетаСуммы);
СтруктураДействий.Вставить("ПересчитатьСуммуСУчетомРучнойСкидки", Новый Структура("Очищать", Ложь));
ОбработкаТабличнойЧастиСервер.ОбработатьТЧ(ДокЗаказ.Товары, СтруктураДействий, Неопределено);


НА КЛИЕНТЕ:

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



СтруктураДействий.Вставить("ПроверитьСериюРассчитатьСтатус", Новый Структура("Склад, ПараметрыУказанияСерий", ТекущаСтрока.Склад, ПараметрыУказанияСерий));
				ОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаСтрока, СтруктураДействий, Неопределено);
```
Программная обработка расшифровки отчета на СКД на обычных формах
Теги: 1С

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

```1c
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
   Перем ВыполненноеДействие;

   // Запретим стандартную обработку расшифровки

    СтандартнаяОбработка = Ложь;

   // Создадим и инициализируем обработчик расшифровки

    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных));

    ДоступныеДействия = Новый Массив();
    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Расшифровать);
    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить);

   // Осуществим выбор действия расшифровки пользователем

    Настройки = ОбработкаРасшифровки.Выполнить(Расшифровка, ВыполненноеДействие, ДоступныеДействия);

    Если Настройки <> Неопределено Тогда
       // Пользователь выбрал действие, для которого нужно менять настройки


        Если ВыполненноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.Упорядочить Тогда

            ФормированиеПечатныхФорм.ПеренестиПорядокВОтчет(Настройки);

           // Если требется упорядочить - упорядочим в текущем отчете

            КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
            СкомпоноватьРезультат(ЭлементыФормы.Результат, ДанныеРасшифровки);


        Иначе

             // При других действиях - создадим новый отчет, откроем форму, сформируем отчет в ней

            Отчет = Отчеты[Метаданные().Имя].Создать();
            Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки);
            Форма = Отчет.ПолучитьФорму();
            Форма.ОбновитьОтчет();
            Форма.Открыть();

        КонецЕсли;
	КонецЕсли;
КонецПроцедуры
```