Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

понедельник, 23 августа 2021 г.

Небортовой самописец самопалов

https://www.facebook.com/aavtaran/posts/1212264005523974

Есть такой сорт программистов - "самописцы" - отважные изобретатели велосипедов, аж двухколёсных.
Если они могут что-то написать сами - они будут писать это сами, несмотря на то, что все уже давно написано до них и протестировано на тысячах проектов, как, например, логгеры.
Казалось бы, задача решена, обкатана, к мотыге прикручен фонарик и трактор, но нет!
Реальная история: Человек потратил время и написал свой логгер.
На вопрос «зачем?», отвечает, что у него там «всякие полезные штуки», например, «штатно пишутся только ворнинги и эрроры, а вот если выскочит эксепшн, то предыдущие N сообщений включая трейс тоже попадут в лог». Замечательно.
Также работник мотивировал самопал тем, что лог всегда можно посмотреть «на ходу и он не залочен» (открыл Маврикий в 2016 году), даже специально там мьютексы использовал, молодец какой.
Ну и вишенка - лог писался в xml руками. Файл открывался на запись, указатель ставился в конец и отматывал назад на несколько байт (надо же перетереть закрывающий тэг)
- Почему в xml?
- Ну.. эм.. так удобнее анализировать утилитами.
При этом данные все равно строкой.
Инструментарий он тоже свой для анализа логов писал, ну а что, кто там полезет разбираться – сидит человек, «работает».
В итоге производительность всей этой красоты была 25 записей в файл в секунду. Таким образом, логгер ограничивал производительность всей системы. А это время и деньги, потому что если записи в базу данных логгировать, то больше 25 записей в секунду не засунешь никогда.
А потом Заказчик ищет консультанта на стороне, да еще и боится обидеть «самописца», который не может разобраться, почему всё тормозит и не понимает, как исправить и использует нелепую фразу-заклинание: «Это что-то системное».
- Слушай, заколебались уже. Можете, не афишируя, глянуть, а? – спрашивает Заказчик.
- Можем.
Интереса ради берем первый попавшийся NLog и сравниваем с пожеланиями «самописца» к своей самоделке. Все решается конфигурацией за 5-15 минут в зависимости от степени знакомства.
Стартовым бонусом - не 25 записей в секунду, а 200 тысяч в ту же секунду, и то понятно, что если еще поработать, то можно удвоить.
При этом не надо ничего налаживать, потому что всё, с чем среднестатистический проект может столкнуться, уже давно найдено и исправлено.
Нет, «самописцы» не тупые, как мог бы подумать кто-то тупой. Напротив, они поражают бессмысленной глубиной. Они отказываются от фреймворков, от библиотек и даже от конструкций языка, странно, что они при этом не идут дальше и не отказываются от чужих (неизвестно кем написанных) языков, компиляторов, операционных систем и архитектур железа.
Даже не интересно, в какой момент у них наступает ступор и деревянность. Скорее всего, всё закончилось там же, где началось. Выучил что-то одно где-нибудь, а может, даже и в вузе, завис и решил, что познал и постиг. И вот это типа кошерно. А обращать внимание на то, что в мире произошло море всего, изучать опыт соседей по планете - типа от лукавого. Так и гоняют черепашку в logo, хотя нет, это уже для продвинутых, не кошерно.
P. S. Все совпадения случайны.
P. P. S. Нет, это не про тебя.
P. P. P. S. И не про тебя.
P. P. P. P. S. Вообще не комментируй эту запись.

понедельник, 14 октября 2019 г.

1С 7.7, "скрытые" возможности функции Шаблон., Получение и установка реквизита формы по его имени.

Отсюда: http://dml.compkaluga.ru/forum/index.php?showtopic=35958

На днях решал тут одну задачу, пришлось столкнуться вот с чем. Допустим на форме у нас есть несколько десятков реквизитов, типа Строка, с именами, к примеру Строка1, Строка2, Строка3 и т.п. Хотелось бы получить доступ к значениям этих реквизитов по имени. Эксперименты с Форма.ПолучитьАтрибут("Строка1") собственно ничего не дали. Полез копаться дальше и накопал вот что. Оказывается в 1С есть крайне полезная функция Шаблон, которая возвращает строку, полученную по шаблону заменой встроенных выражений на значения и форматированием. Так вот, получить значение реквизита формы по его имени можно следующим образом:

Значение = Шаблон("["+ИмяРеквизитаФормы+"]");

Однако в этом случае возвращаемое значение всегда является строкой, т.е. если реквизит формы имеет тип справочника или любой другой агрегатный тип, то мы получим лишь его строковое представление. Для того чтобы обойти это ограничение, применим следующую конструкцию:

Значение=ЗначениеИзСтрокиВнутр(Шаблон("[ЗначениеВСтрокуВнутр("+ИмяРеквизитаФормы+")]")); // - это чтение реквизита формы через шаблон

Ну и напоследок самое вкусное. Две функции, которые можно прописать и в глобальном модуле, которые позволяют читать и записывать реквизит формы по его имени:

//_______________________________________________________Функция УстАтрибут(Атр,Зн)
    
Атр = Зн;
     Возврат
"";
КонецФункции
// УстАтрибут(Атр,Зн) 

Процедура УстановитьАтрибут(Атр,Зн);
     Шаблон(
"[УстАтрибут("+ Атр + ",Зн)]");
КонецПроцедуры
// УстановитьАтрибут(Атр,Зн);

//_________________________________________________________
Функция ПолАтрибут(Атр,Зн)
    
Зн = Атр;
    Возврат
"";
КонецФункции
// УстАтрибут(Атр,Зн)


Процедура ПолучитьАтрибут(Атр,Зн);
     Шаблон(
"[ПолАтрибут("+ Атр + ",Зн)]");
КонецПроцедуры
// УстановитьАтрибут(Атр,Зн);


Использовать, естественно, через ПолучитьАтрибут(...) и УстановитьАтрибут(...) ... вот такой вот нестандартный подход.

пятница, 16 августа 2019 г.

В форме обработки 1С 7.7 не работает команда Активизировать


Проблема: При попытке в коде обработки выполнить команду Активизировать, чтобы вернуть курсор в поле ввода - получаем ошибку "В данной формуле не может быть вызвана эта процедура(функция)"

Решение: Несколько вариантов, например Установить фокус на поле ввода 7.7 или Активизировать поле ввода
Предлагаемый метод - использовать фиктивное закрытие формы. 
Бонус - получаем защиту от случайных нажатий клавиши Esc

Пример:
"РазрешитьЗакрытие" - служебная переменная, анализируемая в процедуре ПриЗакрытии().
"Штрихкод" - имя поля на форме, которое надо активизировать.

При закрытии анализируется переменная "РазрешитьЗакрытие", и в зависимости от её значения -  закрытие отменяется, активизируется требуемое поле и снова таки закрытие отменяется, или же - просто закрываем форму.

Перем РазрешитьЗакрытие;    // флаг используем для разрешения закрытия формы и для обхода ошибки активизации реквизита

Процедура АктивизироватьШтрихКод()    // через фиктивное закрытие формы обойдем ошибку функции Активизировать
    РазрешитьЗакрытие = 2;
    Форма.Закрыть(0);       // вызываем процедуру закрытия
КонецПроцедуры

Процедура ЗакрытьОбработку()        // нажали на кнопку Х - разрешаем закрытие
    РазрешитьЗакрытие = 1;
    Форма.Закрыть(0);       // вызываем процедуру закрытия
КонецПроцедуры

Процедура ПриЗакрытии()
   
    Если РазрешитьЗакрытие=0 Тогда        // простое закрытие запрещаем (страхуемся от случайных закрытий по ESC)
        Сообщить("Закрыть форму можно только по кнопке!");   
        СтатусВозврата(0);    // отменяем закрытие
    ИначеЕсли РазрешитьЗакрытие=1 Тогда    // всё в порядке, это закрытие по кнопке
        //
    ИначеЕсли РазрешитьЗакрытие=2 Тогда    // фиктивное закрытие - для активизации реквизита на форме
        Активизировать("ШтрихКод");       // активизируем наше поле
        СтатусВозврата(0);    // отменяем закрытие
        РазрешитьЗакрытие = 0;    // сбрасывам переменную
        возврат;
   КонецЕсли;
   
КонецПроцедуры

вторник, 4 июня 2019 г.

Программное изменения проводок документа 1С 7.7

Задача: Очистить субконто кредита у всех проводок в одной ручной операции
Решение:
Процедура Сформировать()
    опер = СоздатьОбъект("Операция");
    опер.НайтиОперацию(НашДокументНаФормеСВидомОперация);
    опер.ВключитьПроводки(0);
    опер.ВыбратьПроводки();
    Пока опер.ПолучитьПроводку()=1 Цикл
        опер.Кредит.Субконто(1,"");
    КонецЦикла;
    опер.Записать();
    опер.ВключитьПроводки(1);
КонецПроцедуры



Отсюда:
https://forum.mista.ru/topic.php?id=382542
https://forum.mista.ru/topic.php?id=382419
https://forum.mista.ru/topic.php?id=478141

понедельник, 29 января 2018 г.

1С: парсинг строки с ФИО

Задача: В наименовании справочника много слов после ФИО, надо отбросить всё лишнее.

Решение:
Преобразуем строку с наименованием в многострочную, и возьмем первые 3 слова.

// уберём пробелы слева и справа
наименование = СокрЛП(запр._наименование);
       
// уберём двойные пробелы
наименование = СтрЗаменить(наименование, "  ", " ");
       
// преобразуем в многострочную строку
наименование = СтрЗаменить(наименование, " ", РазделительСтрок);
       
// возьмем столько слов, сколько нужно (выбКвоСлов)
Для сч=1 По выбКвоСлов Цикл
    фио = фио + СтрПолучитьСтроку(наименование, сч) + " ";
КонецЦикла;

вторник, 14 ноября 2017 г.

1С 7.7: вывод прайс-листа в 2 и более колонок

Задача: В 1С 7.7 экономить бумагу, печатая прай-лист в несколько колонок.

Решение: Весь прайс с группами, элементами и даже нумерацией строк выгружаем в таблицу значений (в примере генерится таблица на 500 элементов). Высота первой и последующих страниц задается отдельно..
Текст обработки под катом.

p.s. чёт валялось в черновиках с 2016

понедельник, 4 сентября 2017 г.

1С 7.7: вывод таблицы с сеткой цветов

Для отображения на экране возможных вариантов выделения цветом текста/фона в ячейках печатных форм:

Процедура ПриОткрытии()
    таб = СоздатьОбъект("Таблица");
    таб.ИсходнаяТаблица("Таблица");
    сч = 0;
    Для R=1 По 255  Цикл
        R=R+9;
        таб.ВывестиСекцию("строка|старт");
        Состояние(""+R+"/255");
        Для G=1 По 255  Цикл
            G=G+9;
            таб.ВывестиСекцию("строка|старт");
            Для B=1 По 255  Цикл
                B=B+9;
                Цвет = R * 65536 + G*256 + B;
                выбСекция=таб.ПолучитьСекцию("строка|база");
                выбОбласть=выбСекция.Область();
                выбОбласть.ЦветТекста(Цвет);
                таб.ПрисоединитьСекцию(выбСекция);
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;
    таб.Показать();
    СтатусВозврата(0);
КонецПроцедуры


В ячейке таблицы [строка+база] должно быть следующее выражение:
""+R+РазделительСтрок+G+РазделительСтрок+B

понедельник, 17 июля 2017 г.

Узнать в 1С номер недели в месяце по указанной дате

Задача: Узнать в 1С номер недели в месяце по указанной дате

Решение: Получаем разницу номеров недели в году текущей даты и даты начала месяца.
Рассматривается  здесь и здесь.


В запросе 1С 8.х:
НЕДЕЛЯ(Таблица.НашаДата) - НЕДЕЛЯ(НАЧАЛОПЕРИОДА(Таблица.НашаДата, МЕСЯЦ)) + 1

Для 1С 7.7
НомерТекущейНедели = НомерНеделиГода(НашаДата) - НомерНеделиГода(НачМесяца(НашаДата)) + 1;


вторник, 8 ноября 2016 г.

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

Требуется: Из таблицы значений удалить строки по определенному условию.
Решение: Добавляем дополнительную колонку "признак", тип "Число", Длина 1. Проходим по таблице, проверяем условия, и в строки, которые надо удалить, пишем 1, сортируем по-убыванию, выгружаем в временную таблицу только строки с 0 в служебной колонке.
        ...
        тз.Сортировать("-признак");
        НачальнаяСтрока = 0;
        тз.НайтиЗначение(0, НачальнаяСтрока, "признак");
        Если тз.КоличествоСтрок()=0 Тогда
            Сообщить("Пустая таблица!");
            Возврат;
        КонецЕсли;
        врем_тз = СоздатьОбъект("ТаблицаЗначений");
        тз.Выгрузить(врем_тз, НачальнаяСтрока);
        тз = врем_тз;
        ...

понедельник, 31 октября 2016 г.

Форматы географических координат и их преобразования

Задача: В ПО Мобильная торговля А+ координаты хранятся в виде ГГММ.ММММ, необходимо преобразовать к формату хранения Яндекс/Google, вида ГГ.ГГГГГГ

Решение:
Хорошее описание здесь, в wiki еще одного поставщика решений для мобильной торговли.

Общие понятия о форматах координат
Единого стандарта записи нет, но существует множество вариантов, которые используются на практике. Среди них: 

  • DMS (градусы, минуты, секунды) — наиболее понятная для восприятия запись, в которой раздельно указываются градусы, минуты и секунды (последние обычно указываются с точностью до определенного знака). В этой записи чаще всего полушарие обозначается латинской буквой (N/S и W/E).
  • DD (градусы в десятичном виде) — наиболее простая в числовом выражении запись, в которой целая часть представляет градусы, а дробная (обычно 6 знаков) — все остальное. Полушария обозначаются знаком плюса или минуса (реже буквами). Такая запись менее наглядна, но зато удобна для хранения в информационных системах. Большинство бытовых GPS-устройств и картографических сервисов использует именно это формат.
  • DM, UTM, Geo-Tags и другие менее распространенные и экзотические форматы — используются в различных специализированных системах.

Формат координат в продуктах ST и А+
Как и "А+ Мобильная Торговля 2.0", в программах «ST Чикаго» и «ST Мобильная Торговля» географические координаты в БД хранятся в редко используемом сейчас формате
ГГММ.ММММ.
Где: 
ГГ — градусы; 
ММ.ММММ — минуты и десятитысячные доли минут.
Это одна из GPS-нотаций, иногда обозначаемая как GPS (Dec Min).

ПО фактически получает и использует для своих нужд «нормальный» десятичный формат (DD), в котором снимают данные большинство современных GPS-приемников (в т.ч. в смартфонах и планшетах). Однако в БД координаты записываются уже в формате ГГММ.ММММ .
В интерфейсах, как правило, используется наиболее наглядный формат DMS.

Историческая справка
Формат ГГММ.ММММ был унаследован продуктами А+ и ST от навигатора Garmin в начале 2000-х, когда КПК не имели собственных GPS-приемников.
Этот формат есть упрощенная запись формата ГГ°ММ.СС, рекомендуемый для использования в морском радиообмене. В настоящее время используется реже, чем «нормальный» десятичный формат.

Перевод между форматами
ГГММ.ММММ → ГГ.ГГГГГГ
Для перевода необходимо использовать формулу ГГ + (ММ.ММММ ÷ 60):

ГГ.ГГГГГГ → ГГММ.ММММ
Для перевода необходимо использовать формулу (ГГ × 100) + (0.ГГГГГГ × 60):

Пример для Excel:
В Microsoft® Excel можно использовать формулу: = ЦЕЛОЕ(A1)*100 + ОКРУГЛ((A1-ЦЕЛОЕ(A1))*60;4), где в ячейке A1 находится значение в формате ГГ.ГГГГГГ

Пример для 1С:

// ================================================================================================
// из формата А+ в формат яндекса/гугла (ГГММ.ММММ в ГГ.ГГГГГ)
Функция КонвертироватьКординатуИзАгентПлюс( _коорд )
 
 Градусы = Цел(_коорд / 100);
 Минуты = _коорд - Градусы * 100;
 
 Возврат Окр((Градусы+Минуты/60), 5);
 
КонецФункции


// ================================================================================================
// из формата яндекса/гугла в формат А+ (ГГ.ГГГГГ в ГГММ.ММММ)
Функция КонвертироватьКординатуВАгентПлюс( _коорд )
 
 возврат Цел(_коорд)*100 + Окр((_коорд - Цел(_коорд))*60, 4)
 
КонецФункции


среда, 26 октября 2016 г.

Вывод из 1С 7.7 в Word (OLE, с разбиением страницы на колонки)


Задача: Снова встала задача вывести из 1С в Word немного текста. В этот раз отличительной особенностью стала необходимость вывода шапки на всю ширину страницы, а таблицу - разместить ниже в 2 колонки.

Для небольших таблиц в пару сотен строк кода работает прекрасно. Для больших - лучше формировать не через OLE, иначе можно смело оставлять на пару часов.

Решение: Задача старая, много полезных ссылок:
https://helpf.pro/faq8/view/635.html
http://superadm.net/index.php?name=pages&op=view&id=98
http://infostart.ru/public/67727/ - с готовым примером, много комментариев
http://www.delphimaster.ru/articles/dbtoword/index.html - отличные примеры на Дельфи
Самый лучший и полный  - http://scriptcoding.ru !


Под катом моя версия и копия с инфостарта.


понедельник, 3 октября 2016 г.

Использование службы геокодирования Google в 1С 7.7 + чтение динамических страниц

Задание: В 1С для каждой торговой точки записан адрес, необходимо по адресу торговой точки получить ее координаты, для последующего отображения на карте.

Решение: Для получения координат ТТ по адресу используется Google Maps Geocoding API, описание и документация здесь: https://developers.google.com/maps/documentation/geocoding/intro?hl=ru


"Быстрое" решение - использование функций v7plus.dll:

Функция ПолучитьОтветСлужбыГеокодирования(_Адрес)
 
    Попытка
        Соединение = СоздатьОбъект("Addin.V7HttpReader");
        Соединение.КоличествоПопытокАвторизации = 10;
    Исключение
        Сообщить("Не удалось создать объект Addin.V7HttpReader!");
        Возврат 0;
    КонецПопытки;
   
    //
можем указать json или xml
    Адрес = "http://maps.googleapis.com/maps/api/geocode/xml?address=";
    Адрес = Адрес + "ukraine" + "," + СокрЛП(_Адрес);
    Адрес = Адрес + "&components=country:UA";
 
    Стр = ""; // сюда вернется xml или json ответ сервера, который 
    Попытка
        Соединение.Получить(Адрес, Стр, 2); //строка
    Исключение
        Сообщить("Неудачная попытка соединения.");
    КонецПопытки;
   
    Возврат стр;

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

"Быстрое" решение было рабочим, однако, периодически ответ сервера усекался до 1-2 килобайт. При этом если строку запроса вставить в браузер - всегда возвращается нормальный ответ.

Оказалось, проблема известная, рассматривалась неоднократно:

1. V7Plus не полностью выкачивает страничку
"AddIn.V7HttpReader прекрасно работает с любыми страницами и качает всю как надо. Проблема в самих страницах, которые не отдают заголовок "Content-length". Поэтому по-умолчанию используется 1Кб."


2.V7HttpReader метод получить файл
"С помощью метода ПолучитьКакФайл пытаюсь с сайта выгрузить файл xml нужного формата. Проблема - файл не загружается полностью. ... Пробовал по всякому и через ПолучитьКакСтроку и с циклом после получения (типа для докачивания, если оно в фоне).
Все-равно файл загружается не полностью. Если через браузер все скачивается без проблем."

"Это не работает, когда динамически генерируется страница через пост-запрос. ПолучитьКакФайл работает для скачивания ТОЛЬКО статического содержимого."

И приводится код решения:
    Скрипт = СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.language = "vbscript";
          
    x = CreateObject("Microsoft.XMLHTTP");
    x.Open("GET", АдресСтраницы, 0,"","");
    x.Send();
          
    s = CreateObject("ADODB.Stream");
    s.Mode = 3;
    s.Type = 1;
    s.Open();
          
    Скрипт.AddObject("s",s);
    Скрипт.AddObject("x",x);
    Скрипт.Eval("s.Write(x.responseBody)");
          
    s.SaveToFile(ИмяФайлаЗагрузки, 2);
3. Наиболее подробно и полно вопрос рассматривается здесь: Мои опыты чтения динамических WEB-страниц
  • Вариант 1-5 - различные модификации использования V7HttpReader, и делается вывод, что внешняя компонента v7plus.dll и ее объект AddIn.V7HttpReader не годятся для чтения  динамических WEB-страниц.
  • Вариант 6:  ФС.КопироватьФайл(Адрес,Результат) - нерабочий
  • Вариант 7: WinHttp.WinHttpRequest.5.1
  • Вариант 8: InternetExplorer.Application
  • Вариант 9. MSXML2.XMLHTTP
  • Вариант 10. WinHttp.WinHttpRequest.5.1 + MSScriptControl
  • Вариант 11.MSXML2.XMLHTTP +  MSScriptControl  + VBScript
  • Вариант 12. MSXML2.XMLHTTP (http-test.vbs + WScript.Shell)
  • Вариант 13. Microsoft.XMLHTTP+ MSScriptControl+ADODB.Stream

В итоге, пришлось переписать процедуру на вариант с использованием Microsoft.XMLHTTP +
ADODB.Stream + MSScriptControl.ScriptControl.

Код функции под катом:

четверг, 2 июня 2016 г.

1С 8.х: Использование стандартных периодов в СКД

Отсюда: http://1cskd.ru/2010/07/ispolzovanie-standartnyx-periodov/

Для удобства работы с параметрами типа дата, в системе компоновки данных существует возможность использовать Стандартные периоды.
Как же их использовать?
Мы имеем отчет, в котором 2 параметра: Начало периода и Конец периода. Добавим в параметры третий параметр, назовем его Стандартный период и установим ему тип СтандартныйПериод.
Для параметров Начало периода и Конец периода в Выражение запишем следующее:
&СтандартныйПериод.ДатаНачала
&СтандартныйПериод.ДатаОкончания
Также у этих параметров установим галку Ограничение доступности.

Все. Теперь можно пользоваться возможностями стандартного периода:

Кроме того, стандартная дата окончания содержит время 23:59:59 что избавляет от проблемы, описанной здесь.

пятница, 25 декабря 2015 г.

Перекодировка текста в/из UTF-8 штатными средствами 1С 7.7

Надо: Сохранить из 1С 7.7 файл в формате UTF-8

Решение больше частью отсюда.
Альтернативные варианты: использование библиотеки от romix или использовать adodb stream.

UPD 16.08.17 По умершей ссылке было что-то вроде этого:

Функция ПреобразоватьСтрокуВУТФ8(Стр)
    Длина=СтрДлина(Стр);
    Итог="";
    Для Н=1 По Длина Цикл
        Знак=Сред(Стр,Н,1);
        Код=КодСимв(Знак);
        Если Код<128 Тогда
            Итог=Итог+Знак;
        Иначе
            Если (Код>=КодСимв("А"))И(Код<=КодСимв("п")) Тогда
                Итог=Итог+Симв(208)+Симв(144+Код-КодСимв("А"));
            ИначеЕсли (Код>=КодСимв("р"))И(Код<=КодСимв("я")) Тогда
                Итог=Итог+Симв(209)+Симв(128+Код-КодСимв("р"));
            ИначеЕсли (Знак="ё") Тогда
                Итог=Итог+Симв(209)+Симв(145);
            ИначеЕсли (Знак="Ё") Тогда
                Итог=Итог+Симв(208)+Симв(129);
            ИначеЕсли (Знак="і") Тогда
                Итог=Итог+Симв(209)+Симв(150);
            ИначеЕсли (Знак="ї") Тогда
                Итог=Итог+Симв(208)+Симв(151);
            ИначеЕсли (Знак="є") Тогда
                Итог=Итог+Симв(209)+Симв(148);
            ИначеЕсли (Знак="Є") Тогда
                Итог=Итог+Симв(208)+Симв(132);
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    Возврат Итог;
КонецФункции

понедельник, 17 августа 2015 г.

1C 8.x: Недокументированное использование стандартных обработок из меню "Все функции".


В платформе 1С предприятие есть очень удобные стандартные функции:

1. Активные пользователи;
2. Журнал регистрации;
3. Поиск ссылок на объект;
4. Проведение документов;
5. Удаление помеченных объектов;
6. Управление внешними источниками данных;
7. Управление итогами;
8. Управление полнотекстовым поиском;
9. Управление расширениями конфигурации;

Однако нигде не описаны варианты их использования кроме вызова из пункта "Все функции" главного меню. Поэтому иногда встречается мнение, что эти функции являются чем-то специфичным и сложным, что они вообще написаны не на 1С, а на С++ как и сама платформа.
На самом деле технически эти функции являются самыми обычными 1С обработками, включенными в состав платформы, и ими можно пользоваться полностью аналогично любым другим привычным обработкам.
Рассмотрим несколько способов их использования на примере стандартной обработки "Поиск ссылок на объекты".

пятница, 3 июля 2015 г.

Заполнение шаблонов Excel из 1С

Требуется: Заполнить готовую книгу Excel с кучей формул и форматированием из 1С.

Решение: Просматриваем из 1С все листы, и в ячейки с примечаниями (комментариями)  записываем результат формулы, указанные в этих же ячейках.

Т.е. нашли ячейку с примечанием - прочитали в ней выражение, вычислили с помощью 1С, и записали обратно в ячейку.


Перебор ячеек с примечаниями - только чтобы ускорить просмотр книги, не перебирать все ячейки в ней.

Идея: http://infostart.ru/public/16466/

Текст примера под катом, функция ЗначениеПоказателя() и переменная ФайлШаблона - в фрагменте не описаны.

воскресенье, 12 апреля 2009 г.

Hello World

How the way people code "Hello World" varies depending on their age and job:
High School/Jr.High

10 PRINT "HELLO WORLD"
20 END


First year in College

program Hello(input, output)
begin
writeln('Hello World')
end.


Senior year in College

(defun hello
(print
(cons 'Hello (list 'World))))


New professional

#include

void main(void)
{
char *message[] = {"Hello ", "World"};
int i;
for(i = 0; i < 2; ++i)
printf("%s", message[i]);
printf("\n");
}


Seasoned professional

#include
#include
class string
{
private:
int size;
char *ptr;
public:
string() : size(0), ptr(new char('\0')) {}
string(const string &s) : size(s.size)
{
ptr = new char[size + 1];
strcpy(ptr, s.ptr);
}
~string()
{
delete [] ptr;
}
friend ostream &operator <<(ostream &, const string &);
string &operator=(const char *);
};

ostream &operator<<(ostream &stream, const string &s)
{
return(stream << s.ptr);
}
string &string::operator=(const char *chrs)
{
if (this != &chrs)
{
delete [] ptr;
size = strlen(chrs);
ptr = new char[size + 1];
strcpy(ptr, chrs);
}
return(*this);
}
int main()
{
string str;
str = "Hello World";
cout << str << endl;
return(0);
}


System Administrator

#include
#include
main()
{
char *tmp;
int i=0;
/* on y va bourin */
tmp=(char *)malloc(1024*sizeof(char));
while (tmp[i]="Hello Wolrd"[i++]);
/* Ooopps y'a une infusion ! */
i=(int)tmp[8];
tmp[8]=tmp[9];
tmp[9]=(char)i;
printf("%s\n",tmp);
}

Apprentice Hacker

#!/usr/local/bin/perl
$msg="Hello, world.\n";
if ($#ARGV >= 0) {
while(defined($arg=shift(@ARGV))) {
$outfilename = $arg;
open(FILE, ">" . $outfilename) || die "Can't write $arg: $!\n";
print (FILE $msg);
close(FILE) || die "Can't close $arg: $!\n";
}
} else {
print ($msg);
}
1;

Experienced Hacker

#include
#include
#define S "Hello, World\n"
main(){exit(printf(S) == strlen(S) ? 0 : 1);}


Seasoned Hacker

% cc -o a.out ~/src/misc/hw/hw.c
% a.out
Hello, world.


Guru Hacker

% cat
Hello, world.

New Manager (do you remember?)

10 PRINT "HELLO WORLD"
20 END


Middle Manager

mail -s "Hello, world." bob@b12
Bob, could you please write me a program that prints "Hello, world."?
I need it by tomorrow.
^D


Senior Manager

% zmail jim
I need a "Hello, world." program by this afternoon.

Chief Executive

% letter
letter: Command not found.
% mail
To: ^X ^F ^C
% help mail
help: Command not found.
% damn!
!: Event unrecognized
% logout

Research Scientist

PROGRAM HELLO
PRINT *, 'Hello World'
END

Older research Scientist

WRITE (6, 100)
100 FORMAT (1H ,11HHELLO WORLD)
CALL EXIT
END

Other humor in the GNU Humor Collection.
Disclaimer

The joke on this page was obtained from the FSF's email archives of the GNU Project.

The Free Software Foundation claims no copyright on this joke.

взято с http://www.gnu.org

суббота, 11 апреля 2009 г.

Эволюция программиста

Школа, 10-й класс

10 PRINT "HELLO WORLD"
20 END



Студент-первокурсник

program Hello(input, output)
begin
writeln('Hello World')
end.




3-й курс

(defun hello
(print
(cons 'Hello (list 'World))))



Выпускник

#include
void main(void)
{
char *message[] = {"Hello ", "World"};
int i;

for(i = 0; i < 2; ++i)
printf("%s", message[i]);
printf("\n");
}



Младший программист

#include
#include

class string
{
private:
int size;
char *ptr;

string() : size(0), ptr(new char[1]) { ptr[0] = 0; }

string(const string &s) : size(s.size)
{
ptr = new char[size + 1];
strcpy(ptr, s.ptr);
}

~string()
{
delete [] ptr;
}

friend ostream &operator <<(ostream &, const string &);
string &operator=(const char *);
};

ostream &operator<<(ostream &stream, const string &s)
{
return(stream << s.ptr);
}

string &string::operator=(const char *chrs)
{
if (this != &chrs)
{
delete [] ptr;
size = strlen(chrs);
ptr = new char[size + 1];
strcpy(ptr, chrs);
}
return(*this);
}

int main()
{
string str;

str = "Hello World";
cout << str << endl;

return(0);
}



Главный программист

[
uuid(2573F8F4-CFEE-101A-9A9F-00AA00342820)
]
library LHello
{
// bring in the master library
importlib("actimp.tlb");
importlib("actexp.tlb");

// bring in my interfaces
#include "pshlo.idl"

[
uuid(2573F8F5-CFEE-101A-9A9F-00AA00342820)
]
cotype THello
{
interface IHello;
interface IPersistFile;
};
};

[
exe,
uuid(2573F890-CFEE-101A-9A9F-00AA00342820)
]
module CHelloLib
{

// some code related header files
importheader();
importheader();
importheader();
importheader("pshlo.h");
importheader("shlo.hxx");
importheader("mycls.hxx");

// needed typelibs
importlib("actimp.tlb");
importlib("actexp.tlb");
importlib("thlo.tlb");

[
uuid(2573F891-CFEE-101A-9A9F-00AA00342820),
aggregatable
]
coclass CHello
{
cotype THello;
};
};


#include "ipfix.hxx"

extern HANDLE hEvent;

class CHello : public CHelloBase
{
public:
IPFIX(CLSID_CHello);

CHello(IUnknown *pUnk);
~CHello();

HRESULT __stdcall PrintSz(LPWSTR pwszString);

private:
static int cObjRef;
};


#include
#include
#include
#include
#include "thlo.h"
#include "pshlo.h"
#include "shlo.hxx"
#include "mycls.hxx"

int CHello::cObjRef = 0;

CHello::CHello(IUnknown *pUnk) : CHelloBase(pUnk)
{
cObjRef++;
return;
}

HRESULT __stdcall CHello::PrintSz(LPWSTR pwszString)
{
printf("%ws
", pwszString);
return(ResultFromScode(S_OK));
}


CHello::~CHello(void)
{

// when the object count goes to zero, stop the server
cObjRef--;
if( cObjRef == 0 )
PulseEvent(hEvent);

return;
}

#include
#include
#include "pshlo.h"
#include "shlo.hxx"
#include "mycls.hxx"

HANDLE hEvent;

int _cdecl main(
int argc,
char * argv[]
) {
ULONG ulRef;
DWORD dwRegistration;
CHelloCF *pCF = new CHelloCF();

hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);

// Initialize the OLE libraries
CoInitializeEx(NULL, COINIT_MULTITHREADED);

CoRegisterClassObject(CLSID_CHello, pCF, CLSCTX_LOCAL_SERVER,
REGCLS_MULTIPLEUSE, &dwRegistration);

// wait on an event to stop
WaitForSingleObject(hEvent, INFINITE);

// revoke and release the class object
CoRevokeClassObject(dwRegistration);
ulRef = pCF->Release();

// Tell OLE we are going away.
CoUninitialize();

return(0); }

extern CLSID CLSID_CHello;
extern UUID LIBID_CHelloLib;

CLSID CLSID_CHello = { /* 2573F891-CFEE-101A-9A9F-00AA00342820 */
0x2573F891,
0xCFEE,
0x101A,
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
};

UUID LIBID_CHelloLib = { /* 2573F890-CFEE-101A-9A9F-00AA00342820 */
0x2573F890,
0xCFEE,
0x101A,
{ 0x9A, 0x9F, 0x00, 0xAA, 0x00, 0x34, 0x28, 0x20 }
};

#include
#include
#include
#include
#include
#include "pshlo.h"
#include "shlo.hxx"
#include "clsid.h"

int _cdecl main(
int argc,
char * argv[]
) {
HRESULT hRslt;
IHello *pHello;
ULONG ulCnt;
IMoniker * pmk;
WCHAR wcsT[_MAX_PATH];
WCHAR wcsPath[2 * _MAX_PATH];

// get object path
wcsPath[0] = '\0';
wcsT[0] = '\0';
if( argc > 1) {
mbstowcs(wcsPath, argv[1], strlen(argv[1]) + 1);
wcsupr(wcsPath);
}
else {
fprintf(stderr, "Object path must be specified\n");
return(1);
}

// get print string
if(argc > 2)
mbstowcs(wcsT, argv[2], strlen(argv[2]) + 1);
else
wcscpy(wcsT, L"Hello World");

printf("Linking to object %ws\n", wcsPath);
printf("Text String %ws\n", wcsT);

// Initialize the OLE libraries
hRslt = CoInitializeEx(NULL, COINIT_MULTITHREADED);

if(SUCCEEDED(hRslt)) {


hRslt = CreateFileMoniker(wcsPath, &pmk);
if(SUCCEEDED(hRslt))
hRslt = BindMoniker(pmk, 0, IID_IHello, (void **)&pHello);

if(SUCCEEDED(hRslt)) {

// print a string out
pHello->PrintSz(wcsT);

Sleep(2000);
ulCnt = pHello->Release();
}
else
printf("Failure to connect, status: %lx", hRslt);

// Tell OLE we are going away.
CoUninitialize();
}

return(0);
}



Менеджер проекта

- Алло, Вася ? Можешь сделать мне программу, которая печатает "Hello, world."?
Это нужно завтра к утру.



Исполнительный директор

From: Петров И.С.
To: Сидоров (Менеджер)
Mark: Срочно !

Требуется программа, печатающая "Hello, world." на экране.
Срок: сегодня к обеду.



Президент компании

- Катенька, сообщи всем, что через час состоится совещание по проекту "Hello, world."


взято с http://ibigdan.livejournal.com