среда, 24 февраля 2016 г.

Windows Server 2008 R2 x64 + 1С 7.7: проблема с "Разобрать по копиям"

Проблема: После миграции с 2003 R2 на 2008 x64 R2 не работает опция "Разобрать по копиям" при печати из 1С 7.7. Независимо от установки флага, листы идут 1-1, 2-2, 3-3, а не 1-2-3, 1-2-3. 
Из других программ (Word-Excel) - все работает прекрасно!
Проблема проявилась на разных подразделениях, на разных физических принтерах,с разными версиями драйверов.

Источники:
Наиболее обсуждаемые темы тут:
http://forum.ru-board.com/topic.cgi?forum=5&topic=28783
http://citrix.pp.ru/forum/viewtopic.php?p=33552
http://www.forum.mista.ru/topic.php?id=530462
https://bugs.etersoft.ru/show_bug.cgi?id=2843

Цитата с баг-трекера etersoft:
Есть 2 способа печати: напрямую и через спуллер. И зависит это от приложения 1С использует печать напрямую. С помощью функций StartDoc, EndDoc
http://msdn.microsoft.com/en-us/library/dd162865(VS.85).aspx
Чтобы раскладка по копиям начала работать необходимо УДАЛИТЬ СТАРЫЕ НАСТРОЙКИ из реестра: ключ (HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Print\Printers\{Имя принтера}) , нужно удалить DefaultDevMode

Решение: Чтобы не устраивать танцы с бубнами, реализовали со стороны 1С, через собственный диалог печати, посылая задания на принтер в цикле.

четверг, 18 февраля 2016 г.

Использование XML в 1С 7.7

Памятка отсюда, хороший был сайт:
http://web.archive.org/web/20041102064633/http://chin.dataltd.ru/index2.php?id=1c_xml1
http://web.archive.org/web/20041102065411/http://chin.dataltd.ru/index2.php?id=1c_xml2

Создание XML-файла с помощью компоненты v7plus.dll.

XML, как известно, один из языков разметки. Подробно о нем можно прочитать в книге и в Инете. С его помощью легко реализовать древовидную структуру хранения данных , а также задать жесткие правила построения дерева, что уменьшит ошибки, связанные с доступом к данным.


Применительно к 1С с его помощью можно реализовать множество задач, в частности по документообороту внутри компании и с внешними корреспондентами, всевозможные переносы справочников и документов между конфигурациями, обмен данными с другими приложениями, поддерживающими формат XML.

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

//Сначала проинициализируем компоненту v7plus, предоставляющую объекты для работы с XML:
Если ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "v7plus.dll") <> 1 Тогда
     Если ЗагрузитьВнешнююКомпоненту(КаталогПрограммы() +
"v7plus.dll") <> 1 Тогда
          Предупреждение(
"Компонента v7plus.dll не найдена!");
     КонецЕсли;
КонецЕсли;
Анализатор = СоздатьОбъект("AddIn.XMLParser");


//Теперь начнем строить дерево документа. Заодно занесем служебную информацию о файле выгрузки в атрибуты корневого элемента
Корень=Анализатор.СоздатьДокумент();
Данные =Корень.СоздатьПодчиненныйЭлемент("Данные");Данные.УстановитьАтрибут("ИБ",КаталогИБ());
Данные
.УстановитьАтрибут("Дата",Строка(РабочаяДата()));
Данные
.УстановитьАтрибут("Оператор",ИмяПользователя());


//И создади две основные ветви Справочники и Документы
Справочники=Данные.СоздатьПодчиненныйЭлемент("Справочники");
Документы=Данные.СоздатьПодчиненныйЭлемент("Документы");
 

// в общей ветке Справочники создадим ветку для справочника Контрагентов
Клиенты=Справочники.СоздатьПодчиненныйЭлемент("Клиенты");


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

 

// выгружаем все нужные реквизиты контрагента
ПН=Клиент.СоздатьПодчиненныйЭлемент("ПолнНаименование");
ПН.Значение=К.ПолнНаименование;
ВК=Клиент.СоздатьПодчиненныйЭлемент("ВидКонтрагента");
ВК.Значение=К.ВидКонтрагента.Идентификатор();

 

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

// Завершающие шаги и сохранение файла
ИмяФайла= СтрЗаменить(Строка(ДатаВыгрузки)+Строка(ДатаВыгрузки1),".","") + ".xml";
ПапкаФайла= "C:\1C\Change\Sweet\";
Корень.Записать(ПапкаФайла+ИмяФайла);



Чтение данных. 


В первой части статьи были рассмотрены простейшие приемы работы по созданию XML-документа. В этой части будут описаны способы получения данных. Основным моментом, на который я хотел бы обратить Ваше внимание, является следующее правило: сперва с помощью методов .ВыбратьУзел() или .ВыбратьУзлы() производится выборка узла/элемента, а затем с помощью методов соответственно .ПолучитьПодчиненныйПоНомеру() и .ПолучитьУзел() обеспечивается непосредственный доступ к узлам/элементам документа. Впрочем, здесь можно провести аналогию работы со справочниками и документами в 1С: сначала делаем выборку с помощью .ВыбратьЭлементы() или .ВыбратьДокументы(), а затем получаем сами объекты .ПолучитьЭлемент() или ПолучитьДокумент(). Оба приема используются в данном примере. Код с пояснениями:

Инициализацию компоненты опустим. Для чтения она ничем не отличается.
//создадим объект для доступа к xml-файлу, загрузим в него файл и получим ссылку на корневой элемент xml-документа. Напомню, что у нас он назван "Данные"
ФайлДанных=Анализатор.СоздатьДокумент();
ФайлДанных.Загрузить(ФайлЭксп);
ВсеУзлы=ФайлДанных.ВыбратьУзлы("Данные");


// получаем доступ к корневому узлу/элементу и читаем его атрибутыДанные=ВсеУзлы.ПолучитьУзел(0);
Сообщить(
"Идет загрузка данных из базы: " +Данные.ПолучитьАтрибут("ИБ"));
Сообщить(
"Выгрузка производилась: " +Данные.ПолучитьАтрибут("Дата"));
Сообщить(
"Выгрузку произвел/произвела: " +Данные.ПолучитьАтрибут("Оператор"));


// следующими операторами мы получаем доступ к двум основным ветвям: ветки Справочники и ветке Клиенты
Справочники=Данные.ВыбратьУзел("Справочники");
Документы=Данные.ВыбратьУзел("Документы");


// "спускаемся" по иерархии глубже и получаем доступ к элементу Клиенты, Выписки и Приходники
Клиенты=Справочники.ВыбратьУзел("Клиенты");
Выписки=Документы.ВыбратьУзел("Выписки");
Приходники=Документы.ВыбратьУзел("Приходники");


//если очень интересно сколько прийдется загружать Контрагентов, то можно воспользоваться следующей конструкцией 

Сообщить("Количество клиентов: " + Строка(Клиенты.КоличествоПодчиненных()));

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

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



среда, 17 февраля 2016 г.

1C 7.7 SQL: Доступ к базе данных на сервере возможен только из одного каталога информационной базы


Проблема: При обновлении 1С получаем сообщение "Доступ к базе данных на сервере возможен только из одного каталога информационной базы".
 
Решение: http://www.pokatashkin.com/it/1c/1108

Обычно это происходит из-за некорректного завершения подключения пользователя к базе. В результате остается зависший SQL-процесс и/или открытые по сети файлы *.LCK в каталоге информационной базы и каталогах пользователей.

Если завис SQL-процесс, то можно либо просто перезагрузить SQL сервер, либо убрать зависший SQL-процесс с помощью SQL Enterprise Manager. Для этого в Management\Current Activity\Process Info перейдите к зависшему процессу и в меню «Action» выберите пункт «Kill Process».

Если проблема в открытых по сети файлах *.LCK, то как и в первом случае можно просто перезагрузить файл-сервер с информационной базой, либо зайти на этом сервере в Управление компьютеров (Computer Management) в Общие папки\Открытые файлы и закрыть все файлы с расширением *.LCK в каталоге информационной базы и каталогах пользователей.

P.S. Виновник в блокировке *.LCK в моем случае, как и здесь Зависание сессий в терминальном режиме  - файл hpmup081.bin. Блокировка вылечилась удалением его из процессов.