Ожерельев Сергей: Блог


Рейтинг за публикации: 1000

Ещё юбилей.

Бан на мисте

Ну вот, после стольких лет мистофлуда наконец-то удостоился чести быть забаненым на неделю.
Причина: озвучивание в одной теме ссылок на такие малоизвестные сайты как нова.сс и ру-борда.ру или ком.
Идиотизм.

О языках. Программирования.

Типичный код на Perl'е выглядит так, как будто программист бился или его били башкой о клавиатуру. Типичный код на 1С выглядит так, что хочется схватить клавиатуру и разбить её на башке программиста.

Анализ сайта infostart.ru

http://www.tic-pr.com/analysis/infostart.ru/

Прикольно, особенно список конкурентов.

 

[FUNCTION] php2json

Моя реализация функции преобразования php-переменных в формат JSON для использования в AJAX-модах для phpbb3.

 http://forum.aeroion.ru/topic459.html

 

Мало ли кому пригодится.

Теперь я знаю что среди тупых одинэснэгов попадаются полуумные экземпляры. (С)

Установка PostgreSQL на Windows7

День задался с самого начала. Наконец-то удалось натянуть PostgreSQL на своём ноуте под виндой7 всего с двух пинков и получаса терзания гугла.

Итак полезные ссылки для страждущих:

Установка PostgreSQL/PostGIS для Windows

Установка PostgreSQL 8.4.2 на Windows 7 (сборка 7600)

установка PostgreSQL 8.3.7-1 в Windows, не могу установить

Как установить postgreSQL 8.3?

Установка PostgreSQL 8.3 на Windows XP

 

А вообще, как правильно заметили на одном из сайтов, доки и мануалы для лошар, реально-адекватные пацаны сначала всё перекурочат.

Что дальше

Первые четыреста рублей, честно заработанные в качестве свободного художника. Из холдинга ушёл две недели назад, хлопнув дверью, новое место даже не начал искать. Податься во франч? И это после многих лет работы на фиксе, да ещё и в крупной конторе? Нет, что-то сама мысль об этом вызывает спазмы желудка.

Спёрто с мисты - 1

Функция ПолучитьКоличествоЖивотных() 

Хорошее название для функции выборки количества пользователей базы..

Функция для добавления колонки данных в табличное поле формы

Функция предназначена в основном для изменения  типовых конфигураций, когда хочется что-то добавить, но не хочется сильно менять штатный код и формы.

 

// Добавляет колонку типа ПолеВвода с данными реквизита табличной части в заданную позицию коллекции колонок табличного поля
// и назначает свойства и действия для созданного элемента
//
// Параметры
//  ПозицияНовойКолонки  - Число - Индекс вставляемой колонки. Если индекс равен количеству колонок или Неопределено, то происходит добавление колонки в конец коллекции.
//  ТабличноеПолеКолонки  - ТабличноеПоле или КолонкиТабличногоПоля  - табличное поле или коллекция колонок табличного поля
//  МетаданныеРеквизита  - Метаданные - Метаданные реквизита табличной части объекта. Данное свойство позволяет указать, какие данные будут отображаться в ячейке табличного поля.
//  ОбработчикиСобытий - Структура - Структура, содержащая список наименований процедур - обработчиков событий элемента управления добавляемой колонки.
//                          Необязательно, по умолчанию неопределён
//  ТекстШапки  - Строка  - Текст, который будет выводиться в заголовке новой колонки табличного поля.
//                          Необязательно, по умолчанию синоним реквизита табличной части объекта
// Возвращаемое значение:
//   КолонкаТабличногоПоля - Вставленная колонка табличного поля.
//
Функция ДобавитьКолонкуТабличногоПоляСДанными(Знач ПозицияНовойКолонки = Неопределено, ТабличноеПолеКолонки, Знач МетаданныеРеквизита, Знач ОбработчикиСобытий = Неопределено, Знач ТекстШапки = "") Экспорт

    Если Не
ЗначениеЗаполнено(ТекстШапки) Тогда
       
ТекстШапки = МетаданныеРеквизита.Синоним;
    КонецЕсли;
    Если
ТипЗнч(ТабличноеПолеКолонки) = Тип("КолонкиТабличногоПоля") Тогда
       
КоллекцияКолонок = ТабличноеПолеКолонки;
    Иначе
       
КоллекцияКолонок = ТабличноеПолеКолонки.Колонки;
    КонецЕсли;

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

    Если
ОбработчикиСобытий <> Неопределено Тогда
        Для каждого
Элемент Из ОбработчикиСобытий Цикл

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

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

    Возврат
НоваяКолонка;

КонецФункции
// ДобавитьКолонкуТабличногоПоляСДанными()

Пример использования функции в процедуре ПриОткрытии либо в переопределённом обработчике (подробнее здесь). Предполагается, что функция находится в общем модуле РаботаСФормами.

// Процедура - обработчик события "ПриОткрытии".
//
Процедура ЛксПриОткрытии()

   
//Добавим новую колонку ДокументПартии в табличное поле Товары
   
РеквизитДокументПартии = ЭтотОбъект.Метаданные().ТабличныеЧасти.Товары.Реквизиты.ДокументПартии;
   
ОбработчикиСобытий = Новый Структура("НачалоВыбора", "ТоварыДокументПартииНачалоВыбора");
   
//Вставим новую колонку справа от колонки ДокументРезерва
   
ИндексДокументРезерва = ЭлементыФормы.Товары.Колонки.Индекс(ЭлементыФормы.Товары.Колонки.ДокументРезерва) + 1;
   
РаботаСФормами.ДобавитьКолонкуТабличногоПоляСДанными(ИндексДокументРезерва, ЭлементыФормы.Товары, РеквизитДокументПартии, ОбработчикиСобытий);

    Выполнить(
РаботаСФормами.ЛксПолучитьСтароеДействиеФормы(ЭтаФорма, "ПриОткрытии"));

КонецПроцедуры
// ЛксПриОткрытии()

//Переопределяем штатный обработчик события ПриОткрытии
РаботаСФормами.ЛксУстановитьДействиеФормы(ЭтаФорма, "ПриОткрытии");

Франчи

Это зло, не люблю франей, много зла от них. Одно слово - франьё дебильное. Про одну франевую контору из чёрного списка оренбургских работодателей. Ничего личного.

О странностях универсального обмена xml

Да, загадка. Делал загрузку данных с помощью штатного обмена xml. Вручную файлик грузится, обьекты создаются. То же загружаю программно, вылетает с ошибкой типа обьект не найден. Плюнул, оставил до выяснения. Сегодня вернулся к той разработке, загрузка прошла нормально. Может тогда были происки инопланетян или неудачное расположение звёзд?

Скучно что-то, кризис творчества

Странно, первая запись блога оказалась популярной по просмотрам. Народ берёт пример с достижений? Правильно, надо стремиться и брать высоты.

Сортировка табличной части документа по значению реквизита номенклатуры

Код
//Процедура, сортирующая табличную часть документа по значению реквизита номенклатуры
Процедура СортироватьТабличнуюЧастьПоРеквизитуНоменклатуры(ДокументОбъект, ИмяТабличнойЧасти = "Товары", ИмяРеквизита = "Код", НаправлениеСортировки = "Возр") Экспорт 

   МетаданныеДокумента = ДокументОбъект.Метаданные();
   Если НЕ ОбщегоНазначения.ЕстьТабЧастьДокумента(ИмяТабличнойЧасти, МетаданныеДокумента) Тогда // Нет такой таб. части в документе
      Возврат;
   КонецЕсли;
   ТабличнаяЧасть = ДокументОбъект[ИмяТабличнойЧасти];
   Если ТабличнаяЧасть.Количество() <= 1 Тогда
      Возврат;
   КонецЕсли;
   
   ВременнаяТаблица = Новый Запрос;
   ВременнаяТаблица.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
   ВременнаяТаблица.Текст = "
   |ВЫБРАТЬ
   |    *
   |ПОМЕСТИТЬ ВременнаяТаблица     
   |ИЗ &ТаблицаДанных КАК ТаблицаДанных
   |";
   ВременнаяТаблица.УстановитьПараметр("ТаблицаДанных", ТабличнаяЧасть);
   ВременнаяТаблица.Выполнить();   
   
   Запрос = Новый Запрос();
    Запрос.МенеджерВременныхТаблиц = ВременнаяТаблица.МенеджерВременныхТаблиц;
   Запрос.Текст = "
   |ВЫБРАТЬ
   |   *
   |ИЗ
   |   ВременнаяТаблица
   |УПОРЯДОЧИТЬ ПО Номенклатура." + ИмяРеквизита + " " + НаправлениеСортировки;
   
   ДокументОбъект[ИмяТабличнойЧасти].Загрузить(Запрос.Выполнить().Выгрузить());
   Запрос.МенеджерВременныхТаблиц.Закрыть();
   
КонецПроцедуры

Функция для формирования и заполнения структуры вложения электронного письма

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

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

КонецФункции // СформироватьСтруктуруВложенияДляЭлектронногоПисьма()


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

   //Формируем список адресов получателей
   СписокАдресов = Новый СписокЗначений;
   СписокАдресов.Добавить(ЭлектронныйАдресКонтрагента, ЭлектронныйАдресКонтрагента);

   //Формируем структуру для письма
   СтруктураНовогоПисьма                      = Новый Структура("Тело, Тема, СписокФайловВложений, Кому, УчетнаяЗапись, ВидТекста");
   СтруктураНовогоПисьма.Тело                 = ТекстПисьма;
   СтруктураНовогоПисьма.Тема                 = ТемаПисьма;
   СтруктураНовогоПисьма.Кому                 = СписокАдресов;
   СтруктураНовогоПисьма.УчетнаяЗапись       = УчетнаяЗаписьЭлектроннойПочты;
   СтруктураНовогоПисьма.ВидТекста            = Перечисления.ВидыТекстовЭлектронныхПисем.Текст;
   Если СписокВложенийПисьма.Количество() > 0 Тогда
      СтруктураНовогоПисьма.СписокФайловВложений = СписокВложенийПисьма;
   КонецЕсли; 

   //Формируем письмо на основании переданной структуры
   СтруктураПисьма = УправлениеЭлектроннойПочтой.НаписатьПисьмо(ПользовательДляОбмена, СтруктураНовогоПисьма, , , , , , , Ложь);

Типа достижение

Рейтинг: 100