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