среда, 18 апреля 2012 г.

1С8:борьба - личный опыт работы с платформой 1с8


Личный опыт Гения 1С борьбы с платформой 1С8
... 4

Введение

Я – программист 1С Осипов Сергей Александрович, 1975 года рождения. В Рунете известен под никами «Гений 1С» и «Фиксин».
С 1999 года я начал заниматься 1С. Сначала 7.7, а в январе 2005 года – 8.0.
Эту книгу я начал писать в мае 2008 года, имея за плечами почти десять лет работы с 1С.
За это время накопил огромное количество опыта не только по 1С, но и по алгоритмам, используемым в учете, а теперь вот решил поделиться этими знаниями.
Книга посвящена 1С версии 8.*, т.к. 1С 7.7 меня уже не интересует.
Книга – не учебник, а сборник рецептов.
В разделе обновления будет выводиться список обновлений, чтобы вы могли ориентироваться в этом большом мануале.
В электронном виде книга распространяется свободно, а в печатном – на общих основаниях закона об авторском праве.
Просьба по возможности указывать ссылку на источник или на авторство.
В книге также использованы работы других авторов, надеюсь, их использование пойдет на пользу делу – изучению и использованию 1С.
Буду благодарен всем за помощь в написании книги.

РАЗДЕЛ: ПРОГРАММИРОВАНИЕ

Платформа: Язык 1С

Пример использования оператора безусловного перехода:
~Метка:
Перейти ~Метка;
Безусловный переход не может вести внутрь условия.

Платформа: Математика в 1С

Хеши, MD5

В 1С нет встроенной функции генерации MD5, приходится использовать сторонние алгоритмы. Есть медленные функции вычисления MD5, написанные на 1С, есть быстрые, но использующие COM-компоненты. Есть быстрые функции вычиления хэшей на 1С, но это не MD5.

Случайные числа

Для генерации случайных чисел можно использовать GUID, т.к. при его генерации используются случайные числа.
В 1с81 появилась функция генерации случайных чисел.

Платформа: Коллекции

Метод НайтиСтроки таблицы значений не всегда возвращает строки в том порядке, в котором он был в исходной таблице.

Платформа: Прикладные объекты

Работа функции «Принадлежит элементу»

Сам справочник не принадлежит себе, что не очевидно прописано в синтакс-помощнике:
С = Справочники.Номенклатура.ИмяПредопределенного;
Сообщить(С.ПринадлежитЭлементу(С.Родитель));

Документы

Мягкое перепроведение документов

Можно немного уменьшить нагрузку на базу при проведении документа, особенно если документ нужно перепровести только по нескольким регистрам, следующим способом:
1. Получить объект по ссылке документа
2. Вызвать его метод «ОбработкаПроведения», при этом метод должен быть описан в модуле документа с ключевым словом Экспорт, чтобы можно было вызвать этот метод у документа.
3. Сравнить коллекцию движений документа Движения по требуемым регистрам с движениями документа по регистрам в базе. Записать новые движения только в том случае, если они отличаются от старых движений.

Регламентные задания

Запуск внешних отчетов по расписанию

Платформа 1с81 не умеет запускать внешние отчеты и сохранять таблицы в Excel. Это умеет делать платформа 1с82.
Но чтобы получить эту возможность в 1с81, можно в COM-соединении создавать OLE-подключение к 1С81 и в нем уже выполнять нужный код.
Пример:
Функция ВыполнитьНаКлиенте(Метод) Экспорт
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
ПарольРобота = Справочники.САПКонстанты.ПарольРобота.Значение;
СтрокаСоединения = СтрокаСоединения + "Usr=""robot"";Pwd=""" + ПарольРобота + """"; //Важно чтобы не было две подряд идущих ;;
ЗаписьЖурналаРегистрации("Отладка",,,,"Соединение для выполнения на клиенте, начало попытки: " + СтрокаСоединения);
Соединение = Новый ComОбъект("V81.Application");
Соединение.Connect(СтрокаСоединения);
ЗаписьЖурналаРегистрации("Отладка",,,,"Соединение для выполнения на клиенте, попытка прошла: " + СтрокаСоединения);
ЗаписьЖурналаРегистрации("Отладка",,,,"Выполнение метода, начало: " + Метод);
Выполнить "Соединение." + Метод;
ЗаписьЖурналаРегистрации("Отладка",,,,"Выполнение метода, завершено: " + Метод);
Соединение.ЗавершитьРаботуСистемы();
ЗаписьЖурналаРегистрации("Отладка",,,,"Завершена работа системы " );
Соединение = 0;
КонецФункции
Процедура РассылкаОтчетаПоПродавцам() Экспорт
ВыполнитьНаКлиенте("_РегламентныеЗадания.РассылкаОтчетаПоПродавцам_Код()");
КонецПроцедуры

РАЗДЕЛ: ФОРМЫ 1С81

Формы 1С81: Элементы управления

Табличное поле

Подсветка текущей строки табличного поля

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

Иерархический просмотр списков в табличном поле

Если в списке отображается дерево справочника, то управлять иерархическим просмотром нужно с использованием свойств «Дерево» и «Иерархический просмотр».
Допустим, у нас есть кнопка «Дерево» в панели «Командная панель».
Тогда код будет выглядеть следующим образом:
Процедура КоманднаяПанельДерево(Кнопка)
Если ЭлементыФормы.ТаблицаНоменклатуры.ИерархическийПросмотр Тогда
ЭлементыФормы.ТаблицаНоменклатуры.Дерево = ложь;
Иначе
ЭлементыФормы.ТаблицаНоменклатуры.Дерево = истина;
КонецЕсли;
ЭлементыФормы.ТаблицаНоменклатуры.ИерархическийПросмотр = НЕ ЭлементыФормы.ТаблицаНоменклатуры.ИерархическийПросмотр;
КонецПроцедуры
Процедура ОбновлениеОтображения()
ЭлементыФормы.КоманднаяПанель.Кнопки.Дерево.Пометка = ЭлементыФормы.ТаблицаНоменклатуры.ИерархическийПросмотр;
КонецПроцедуры

РАЗДЕЛ: ОТЧЕТЫ

Отчеты: Работа с макетами

Печать прозрачных картинок

Если на принтере прозрачная картинка печатается, как не прозрачная, то проблема обычно в драйвере принтера. Проверьте – попробуйте распечатать на любой виртуальный принтер.

Отчеты: Построитель отчета

Обработка макета построителя отчета перед выводом

К сожалению, у построителя отчета нет стандартного способа для настройки макета вывода отчета. Можно указать построителю свой макет, но обычно построитель отчета может генерировать отчеты с самыми разнообразными группировками, поэтому нельзя подготовить заранее макет на любой вариант отчета.
Выход – в динамическом изменении макета отчета. Можно получить макет построителя, обработать его, задав нужные форматы и цвет ячеек, ширину колонок и т.п., а затем указать построителю использовать новый макет для вывода отчета.
Однако не следует забывать, что новый макет будет использоваться всегда, поэтому перед выполнением отчета нужно сбросить макет.
При разработке удобно методом «Показать» перед выводом посмотреть на автоматически сформированный макет, чтобы увидеть, как называются параметры и заголовки.
Общая схема подхода такая:
ПостроительОтчетаОтчет.Макет = Неопределено; //Сбрасываем макет
ПостроительОтчетаОтчет.Выполнить(); //Формируем авто-макет
ТекМакет = ПостроительОтчетаОтчет.Макет; //Обрабатываем макет отчета
….
ПостроительОтчетаОтчет.Макет.Показать(); //Смотрим макет во время разработки
ПостроительОтчетаОтчет.Макет = ТекМакет; //Устанавливаем обработанный макет
Рассмотрим конкретные способы модификации макета.
В следующем примере показан цикл, который ищет в макете ячейки, содержащие целиком текст «Дата». Если этот текст содержится в заголовке (вид заполнения ячейки – текст), тогда меняет заголовок шапки. Если текст содержится в параметре (вид заполнения ячейки – параметр), тогда меняет ширину колонки и формат даты:
Область = Неопределено;
Пока (Истина) Цикл
Область = ТекМакет.НайтиТекст("Дата", Область,,,истина);
Если Область = Неопределено Тогда
Прервать;
КонецЕсли;
Если Область.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр Тогда
Область.Формат="ДФ=dd.MM.yyyy";
Область.ШиринаКолонки = 10;
КонецЕсли;
КонецЦикла;
Параметр «истина» в методе «НайтиТекст» указывает, что нужно искать текст целиком.
Бесконечный цикл – удобный инструмент для обработки всех найденных областей по указанному условию.

Отчеты: Система компоновки данных (СКД)

Программная обработка настроек СКД

В разделе описывается, как программно обрабатывать настройки СКД.

Настройка группировок настройки СКД

Для поиска группировок можно написать рекурсивный обработчик, который перебирает структуру настроек, и ищет нужную группировку. Группировки можно промаркировать именами и искать по именам.
Если точно известно, в каком месте структуры находятся нужные поля, можно использовать непосредственное указание по индексу, например:
Поле = НайтиВКоллекцииПоРеквизиту(КомпоновщикНастроек.Настройки.Структура.Получить(0).Структура.Получить(0).ПоляГруппировки.Элементы, "Поле", Новый ПолеКомпоновкиДанных("ХарактеристикаНоменклатуры"))

Поиск и установка параметров настройки СКД

В примере ищется параметр с именем «Склад» и, если найден, устанавливаетсяв значение, указанное в переменной ВыбСклад. При этом устанавливается галочка использования параметра:
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Склад"));
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Значение = ВыбСклад;
ЗначениеПараметра.Использование = Истина;
КонецЕсли;

Отчеты, которые сложно написать на СКД

На СКД можно написать практически 90% всех необходимых на практике отчетов, но некоторые отчеты довольно сложно ложатся на структуру СКД.

Отчеты, где ресурсы расположены выше группировок

Такие отчеты удобны, чтобы сравнивать значение одного ресурса (количество, сумма) по разным измерениям – по складам, периодам и т.п.

РАЗДЕЛ: ТОРГОВОЕ ОБОРУДОВАНИЕ

ТО: Работа со штрих-кодами

Последовательная генерация штрих-кодов

Если нужно последовательно генерировать штрих-код с заданным префиксом, можно использовать подобный код, на вход которого подается Префикс. В примере код заносится в наименование справочника характеристики номенклатуры, соответственно и запрос ведется по наименованиям:
Если НЕ ЗначениеЗаполнено(Префикс) Тогда
Предупреждение("Не заполнен префик, обратитесь к разрабочкику!");
Возврат;
КонецЕсли;
З = Новый Запрос(
"ВЫБРАТЬ
| МАКСИМУМ(ХарактеристикиНоменклатуры.Наименование) КАК Наименование
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|ГДЕ
| ХарактеристикиНоменклатуры.Наименование ПОДОБНО &Маска");
З.УстановитьПараметр("Маска", бф.ДополнитьСтрокуСимволами(Префикс, 13, "_"));
МаксЧисло = 0;
Выборка = З.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ТекШК = Выборка.Наименование;
Если ТекШК <> NULL Тогда
//Обрезаем правый символ
МаксСтрока = Лев(ТекШк, СтрДлина(ТекШк) - 1);
//Обрезаем префикс
МаксСтрока = Сред(МаксСтрока, СтрДлина(Префикс) + 1);
Попытка
МаксЧисло = Число(МаксСтрока);
Исключение
Предупреждение("Не получилось выразить в число максимальный штрих-код в системе: " + ТекШК);
Возврат;
КонецПопытки;
КонецЕсли;
КонецЕсли;
МаксЧисло = МаксЧисло + 1;
ЧислоСтрокой = Формат(МаксЧисло, "ЧДЦ=0; ЧГ=");
Основа = Префикс + бф.ДополнитьСтрокуСимволами(ЧислоСтрокой, 12 - СтрДлина(Префикс) ,"0", ложь);
ШтрихКод = бф.СформироватьEAN13(Основа);
Наименование = ШтрихКод;
Используются функции из библиотеки функций:
Функция ДополнитьСтрокуСимволами(С, Длина, Символ, Справа=истина) Экспорт
//Назначение: Дополняет строку С символами Символ до нужной длины Длина слева или справа, в зависимости от флага Справа
Функция СформироватьEAN13(Основа) Экспорт
//Назначение: формирует правильный EAN13 по первым 12 символам
Например, с префиксом 225 получаются штрих-кода: 2250000000014, 2250000000021, 2250000000038, …

РАЗДЕЛ: БЕЗОПАСНОСТЬ

Рассмотрены вопросы прав доступа, протоколирования и прочие.

Безопасность: Права доступа

Запрет интерактивной работы

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

РАЗДЕЛ: ОБМЕНЫ

Рассмотрены вопросы обмена данными между 1С и другими системами.

Обмены: Планы обмена

Объекты планов обмена

Объекты плана обмена – довольно странные сущности. Они имеют ссылку, но эта ссылка действительна только в пределах одной базы. Если эта ссылка переедет в другую базу, то она будет ссылаться уже на другой объект. Поэтому для ссылки на конкретный объект плана обмена можно использовать только код объекта, благо, что он уникальный.
Объекты плана обмена не регистрируются в таблицах изменений планов обмена.
Не рекомендуется в объектах плана обмена добавлять реквизиты, которые должны хранить различные значения в различных узлах УРБД. Эти реквизиты в периферийных базах при получении первого же файла автообмена из центра будут заменены реквизитами центральной базы. Для хранения таких реквизитов рекомендуется использовать регистр сведений с измерением код (не ссылка) плана обмена.
В файле автообмена из центра содержится секция nodes, где перечислен центральный узел и узел-получатель со своими реквизитами. В файле автообмена в центр такой секции нет, т.е. изменения в объекте плана обмена на периферии игнорируются.
В связи с этим непонятно, почему реквизиты плана обмена доступны на редактирование на филиале, если они всегда затираются реквизитами из центра.

Обмены: Обмены данными

Недопустимые символы в плане обмена

Если обмен не происходит из-за ошибки вида «Текст XMLсодержит недопустимые символы в позиции …», то значит в базе данных содержатся данные, которые не могут быть выгружены в XML.
Найти такие данные может типовая обработка «ВыгрузкаЗагрузкаДанныхXML». Она также удаляет недопустимые символы.
Однако есть один нюанс – она не может удалить недопустимые символы из записи по удалению объекта, особенно если это удаление записи регистра сведений.
Т.е. она показывает найденную пустую запись, но очистить недопустимые символы не может.
Справиться в этой ситуации поможет или полная очистка регистрации по объекту, содержащему недопустимые символы, или более мягкий способ – обработка «ПросмотрЗарегистрированныхИзменений fixin», которая показывает ключи всех записей, зарегистрированных в плане обмена. Можно найти нужную запись и удалить:
Типовая обработка по просмотру зарегистрированных изменений показывает только количество записей, нужно заходить в каждую запись и искать нужную. Это долго.

Обмены: Распределенные информационные базы (РИБ)

РИБ – это распределенные информационные базы, типовой механизм платформы 1с8 для организации баз данных с одинаковой конфигурацией, обменивающихся между собой информацией.

Создание начального образа

При создании начального образа выгружаются все объекты, для которых включена авторегистрация. Поэтому, если объект может мигрировать или не мигрировать в зависимости от реквизитом, нужно отключать для него авторегистрацию в плане обмена.

Обмены: Обмен по правилам

Предопределенные элементы в обеих базах

Если требуются предопределенные элементы справочника с одинаковым названием в обеих базах обмена, нужно сначала завести эти элементы в обеих базах, затем сделать обмен.
В результате в обеих базах появятся по два экземпляра каждого элемента. Один будет предопределенным, другой – из другой базы.
Далее для каждого предопределенного элемента делаем (можно одновременно для всех):
1. В одной из баз переименовываем не предопределенный элемент в элемент с припиской «(не использовать)» и помечаем его на удаление.
2. Выполняем замену ссылок на помеченный на удаление объект на непомеченный объект:
3. Делаем обмен между базами. В другой базе после обмена элементы выглядят так:
4. Если в другой базе есть пары, заменяем их аналогично, заменой ссылок.
При замене заменятся ссылки в регистре соответствий объектов обмена и все будет работать корректно.

РАЗДЕЛ: ИНТЕГРАЦИЯ

Рассмотрены вопросы интеграции 1С с другими приложениями и системами.

Интеграция: Работа с 1С через COMи OLE

Работа с 1С по COM и OLE происходит одинаковым образом.

Неявно описанные методы COM и OLE

В документации явно не прописаны некоторые методы COM и OLE.
Для работы большинства методов у пользователя, под которым подключается COM-соединение, должны быть полные права.
Например, чтобы создать в подключении новый объект, аналогично оператору Новый ИмяТипа(А1, А2), мы должны писать:
Подключение.NewObject("ИмяТипа", А1, А2);
Вычислить произвольное выражение можно с помощью функции Eval:
Подключение.Eval("1+2");

Общие сведения о Com-соединениях

Com-соединение устанавливается быстрее, чем OLE-соединение.
Для того, чтобы Com-соединение было установлено, нужно чтобы 1С была штатно проинсталлирована на компьютере. Если вы установили portable-версию 1С, то соответствующий объект не будет установлен.

Шаблон Com-соединения

В примере изображен рабочий образец кода Com-соединения, написанный на java-script. Он подключается к базе, проверяет состояние изменения конфигурации. Если конфигурация изменена, то в дальнейшем может следовать код по отключению сеансов и завершения работы пользователей.
//Try to connect to v81 base
var V8 = new ActiveXObject("V81.COMConnector"); //для 1с80 использовать V80.COMConnector
try {
ConnectionString = 'File="C:\\1c\\Catalog";Usr="Admin";Pwd="123456"'; //Для серверной: Srvr="server";Ref="1cBase"
var Base = V8.Connect(ConnectionString);
var isConfigUpdate = Base.КонфигурацияИзменена();
WScript.Echo('Состояние флага изменения конфигурации: ' + isConfigUpdate);
} catch(e){
WScript.Echo('Не удалось создать com-соединение!' + e.description);
}
Для доступа к объектам базы можно использовать примерно следующий код:
varNewGood = Base.Справочники.Номенклатура.СоздатьЭлемент();

Выполнение произвольного кода 1С в Com-соединении

Чтобы выполнить произвольный код на языке 1С в Com-соединении, достаточно добавить в модуль внешнего соединения видимую извне (экспортируемую функцию), например, так:
Функция Run(Код) Экспорт
Перем Р;
Выполнить(Код);
Возврат Р;
КонецФункции
При этом код может устанавливать значение локальной переменной Р, значение которой и будет возвращено, как значение функции.

Интеграция: Внешние компоненты

Использование функции ПодключитьВнешнююКомпоненту

Функция «ПодключитьВнешнююКомпоненту» не работает с русскими именами каталогов. А ведь обычно файлы бросаются во временный каталог, поэтому можно использовать преобразование имени файла к схеме 8.3:
FileSystemObject=Новый COMObject("Scripting.FileSystemObject");
FileName= FileSystemObject.getFile(LongPath).ShortPath; //Файл должен уже существовать к этому моменту

Интеграция: Прочее

Веб-сервисы рассмотрены в отдельной моей статье «Веб-сервисы в 1С».

РАЗДЕЛ: АДМИНИСТРИРОВАНИЕ

Администрирование 1С

Ошибки SDBL

Код ошибки
Примечание
Для полей, начиная с FileName, не хватило значений (pos=19)
Лечится путем запуска в консоли SQLсервера команд:
TRUNCATE TABLE _ConfigChangeRec
TRUNCATE TABLE _ConfigChangeRec_ExtProps
Возникает при обновлении конфигурации ИБ

Работа из командной строки

Параметры запуска из командной строки можно посмотреть в справке по 1С, по ключу «Командная строка».

Запуск 1С из командной строки

Для серверного варианта:
"C:\Program Files\1cv81\bin\1cv8.exe" enterprise /S "Sever" /N "username" /P "password"
Дляфайловоговарианта:
"C:\Program Files\1cv81\bin\1cv8.exe" enterprise /F "Catalog" /N "username" /P "password"
Где:
· Server – имя сервера 1С
· Base – имя базы на сервере 1С
· Catalog – каталог файловой базы
· Enterprise – режим запуска в 1С-предприятии.

Названия таблиц и полей в физической базе 1С

Названия таблиц и их полей в базах РИБ могут быть различными в центральной и периферийной базах.

Надежность файловой версии

В некоторых случаях при выключении питания или зависании компьютера теряются последние введенные данные в 1С. Иногда причиной такого поведения может быть кэширование файлов на уровне Windows или локальной сети.
Чтобы избежать проблем из-за кэширования, нужно:
1. Для диска с базой – зайти в Свойства - Оборудование, выбрать дисковое устройство – винчестер, на котором размещен диск, зайти в его Свойства – Изменить параметры – Политика и сбросить галочку «Разрешить кэширование для этого устройства»:
2. Отключить доступные автономно папки. Если папка каким-либо образом расшарена, т.е. доступна по локальной сети, у нее нужно выключить автономное использование. В нашем случае расшарен был целиком диск C под скрытым именем C$.

Надежность SQL версии

SQL-версия тоже может преподносить сюрпризы. В практике встречаются случаи, когда базу нельзя полностью восстановить из выгруженного DTфайла, т.к. при загрузке в SQLверсию выдается сообщение о нарушении индекса. При этом дальнейшее восстановление базы останавливается. Можно попытаться загрузить базу в файловую версию, но если одна из таблиц больше 4 Гб, ничего не получится. Поэтому главным способом профилактики подобных ситуаций является параллельное архивирование базы средствами SQLсервера и периодическое выполнение тестирования и исправления баз данных.

Portable установка 1C

1С можно установить на компьютер без инсталляции. Для этого достаточно просто скопировать папку BIN уже установленной 1С.
Необходимо только инсталлировать драйвер ключа защиты. Поэтому это не чистая portable программа, но очень похожа.
В portableрежиме не доступны COM и OLE-соединения, т.к. они не прописаны в реестре.
Для того, чтобы они заработали, нужно выполнить регистрацию 1cv8.exe:
"C:\Program Files\1cv81\bin\1cv8.exe" /regserver
Предыдущий способ не всегда срабатывает, возможен вариант регистрации COM-компоненты:
regsvr32 "C:\Program Files\1cv81\bin\comcntr.dll"
В Vista/Win7 нужно выполнять эти команды под правами администратора. Но тоже не всегда срабатывает.

Взаимодействие платформы с системой безопасности Windows

Для нормальной работы XBASE (DBF-файлов) требуется доступ на создание и изменение файлов в каталоге временных файлов Windows. Узнать расположение этого каталога можно в переменных среды или через команду settemp.

Прекращение сеансов файловой версии

На одном компьютере может быть запущено несколько баз, поэтому требуется сначала определить, какой из процессов 1С относится к какой базе. Для этого можно с помощью консольной утилиты handle.exe определить список процессов, которые блокируют файл 1c8.1cd (автор идеи – Петрик Николай) и затем убить эти процессы:
Пример:
handle.exe 1cv8.1cd > C:\test.txt
Получим test.txt:
Handle v3.42
Copyright (C) 1997-2008 Mark Russinovich
Sysinternals - www.sysinternals.com
1cv8.exe pid: 5080 3A8: D:\Work\Клиент1\81\только конфа\1Cv8.1CD
1cv8.exe pid: 2148 3A8: D:\Work\Клиент1\81\БП 1.6.17\1Cv8.1CD
Далее, можно распарсить этот текст и получить pid процессов, которые нужно убить.
Убить процессы можно, например, с помощью следующего кода (java-script):
//Убиваем все процессы 1С
var Processing = new ActiveXObject("WbemScripting.SWbemLocator");
var Service = Processing.ConnectServer(".");
var Items = new Enumerator(Service.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '1cv8.exe'"));

for (Items.moveFirst(); !Items.atEnd(); Items.moveNext()) {
var Item = Items.item();
Item.Terminate(0);
WScript.Echo('Kill process 1s8'); //удаляем процесс 1с8
}
В примере уничтожаются все процессы 1s8. Код нужно доработать, чтобы убивать только процессы заданной базы данных.

Быстродействие файловой системы при работе нескольких пользователей

Иногда ускорить работу 1С могут следующие действия:
· Отключить полнотекстовый поиск.
· Уменьшить количество файлов в каталоге
· Сжать базу, чтобы уменьшить ее размер.

Советы по обновлению конфигурации

Если устанавливать блокировку на сервере с датой начала и датой конца, то программа 1С сама будет предупреждать о приближающейся блокировке, а по наступлении даты начала отключит сеанс (точные периоды предупреждений не знаю).
Иногда конфигуратор при обновлении перестает отвечать на команды и как-бы зависает. Можно в диспетчере задач найти конфигуратор и выполнить для него команду «На передний план» или «Переключиться». Обычно это происходит, когда зависает диалоговое модальное окно принятия изменений в конфигурации.

Сервер: 1С-предприятия

Перезапуск сервера 1С

Для перезапуска сервера 1С можно остановить службу сервера и запустить ее снова.
Вот проверенный вариант:
Set WshShell = WScript.CreateObject("WScript.Shell")
'Перезапуск Агента сервера 1С:Предприятия 8.1
WshShell.Exec("sc.exe stop ""1C:Enterprise 8.1 Server Agent")
WScript.Sleep 60000 '60 seconds
WshShell.Exec("sc.exe start ""1C:Enterprise 8.1 Server Agent")
WScript.Sleep 60000 '60 seconds
'Перезапуск Агента сервера 1С:Предприятия 8.2
WshShell.Exec("sc.exe stop ""1C:Enterprise 8.2 Server Agent")
WScript.Sleep 60000 '60 seconds
WshShell.Exec("sc.exe start ""1C:Enterprise 8.2 Server Agent")
WScript.Sleep 60000 '60 seconds
Есть еще другой вариант, но он вызывает сомнения (в примере нужно заменить имя сервера aladdin на нужное):
Dim oCatalog 'As COMAdmin.COMAdminCatalog'
Dim sName 'As String'
Set oCatalog = CreateObject("COMAdmin.COMAdminCatalog","aladdin")
sName = "1CV8"
oCatalog.ShutdownApplication sName
oCatalog.StartApplication sName
Set oCatalog = Nothing

Сервер: Microsoft SQL Server для 1С

SQL-почта для уведомлений

Устаревшая компонента называется SQL-mail. Новая компонента называется Database Mail, находится по пути Управление – Компонент «Database Mail».
Отправка тестового сообщения осуществляется по ПКМ на компоненте «Database Mail» - «Отправка тестового сообщения»:
Списки рассылок для уведомлений (операторы) задаются по пути «Агент SQL Server – Операторы». Если требуется задать несколько почтовых адресов, они разделяются точкой с запятой.
В заданиях «Агент SQL сервер» - Задания получатель сообщения оператор-получатель задается в поле Электронная почта на закладке «Уведомления»:
Возможно рассылать уведомления всегда при завершении, а также при успешном или ошибочном завершении задания.

Планирование заданий средствами SQL-сервера

В SQL есть встроенный планировщик заданий. Чтобы им воспользоваться, нужно:
1. Зайти в Microsoft SQL Server Management Studio.
2. Создать новое задание в Агент SQL Server:
3. Дать заданию имя:
4. Перейти на закладку «Шаги», добавить новый шаг:

В поле команда указываем текст команды на SQL (команда должна завершаться словом GO):
BACKUP DATABASE [UTOffice] TO DISK = N'E:\1CBackUp\SQL_BASES\Backups\UTOffice' WITH NOFORMAT, NOINIT, NAME = N'UTOffice', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO
5. Можно добавить дополнительные шаги.
6. Сохраняем шаги. На закладке «Расписания» указываем расписание запуска задания:
7. Нажать ОК. Задания можно увидеть в разделе «Агент SQL Сервер»:
8. Все, задание настроено. Остается только проверить результаты его работы.

Архивирование баз средствами SQLсервера

Для создания архива с заданным именем, включающим дату и время архивирования вида UTOffice-2012-01-01-03-01-02, можно воспользоваться скриптом (в примере для базы UTOffice):
declare @d varchar(500);
select @d = convert(varchar(20),getdate(),20);
select @d = replace(@d, ':', '-');
select @d = replace(@d, ' ', '-');
-- Путь, куда архивировать
select @d = 'E:\1CBackUp\SQL_BASES\Backups\UTOffice-' + @d ;
BACKUP DATABASE [UTOffice] TO DISK = @d WITH FORMAT, INIT, COMPRESSION, NAME = N'UTOffice', SKIP, NOREWIND, NOUNLOAD, STATS = 10
Если в имени файла должна присутствовать только дата, тогда можно использовать другой вариант:
select @d = 'E:\1CBackUp\SQL_BASES\Backups\BUH2-' + convert(varchar(10),getdate(),120);
Если требуется в расписании вставить несколько команд архивации, можно записать их так:
select @d = 'E:\1CBackUp\SQL_BASES\Backups\BUH_MAG-' + convert(varchar(10),getdate(),120);
BACKUP DATABASE [BUH_MAG] TO DISK = @d WITH FORMAT, INIT, COMPRESSION, NAME = N'BUH_MAG', SKIP, NOREWIND, NOUNLOAD, STATS = 10
declare @d varchar(500);
select @d = 'E:\1CBackUp\SQL_BASES\Backups\buh_newtm-' + convert(varchar(10),getdate(),120);
BACKUP DATABASE [buh_newtm] TO DISK = @d WITH FORMAT, INIT, COMPRESSION, NAME = N'buh_newtm', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO

Периодическая копия базы

Самый удобный и полезный вариант архивирования баз – создание ее зеркальной копии. В отличии от простого архива способ хорош тем, что всегда есть предыдущая рабочая копия базы. Можно создавать каждой ночью копию базы на утро, раз в неделю – копию базы на начало недели, раз в месяц – копию базы на начало месяца и т.п.
Восстановление можно совместить с архивацией, добавив в скрипт архивации команды (в примере восстановление в базу UtOfficeDAY):
-- Отключение сеансов пользователей в базе-получателе
alter database [UTOfficeDay] set RESTRICTED_USER with rollback immediate;
RESTORE DATABASE [UTOfficeDay] FROM DISK = @d WITH FILE = 1, MOVE N'UTOffice' TO N'e:\1CBackUp\SQL_BASES\Day\UTOfficeDAY.mdf', MOVE N'UTOffice_log' TO N'e:\1CBackUp\SQL_BASES\Day\UTOfficeDAY_log.ldf', NOUNLOAD, REPLACE, STATS = 10

Восстановление копии базы из архива SQL

Восстановить базу из архива в SQLможно интерактивно, несколькими щелчками мыши.
Но часто возникает задача восстановить базу в ее копию, чтобы посмотреть, что изменилось в базе.
Для этой задачи нужно выполнить подобный запрос, входные данные:
· arc_filename – полное имя файла архива, из которого будет осуществляться восстановление данных
· src_base_name – имя исходной SQL-базы
· dst_base_name – имя конечной SQL-базы
· dst_base_path– путь, по которому расположены файлы конечной SQL-базы
Запрос подразумевает, что файлы базы данных именуются стандартно, т.е. «*.mdf» и «*_log.ldf».
-- Declare all variables
declare @arc_filename varchar(1024);
declare @src_base_name varchar(1024);
declare @dst_base_name varchar(1024);
declare @dst_base_path varchar(1024);
declare @src_log_name varchar(1024);
declare @dst_log_name varchar(1024);
declare @dst_base_filename varchar(1024);
declare @dst_log_filename varchar(1024);
-- Parameters for procedure of restoring data
select@arc_filename= 'e:\1CBackUp\SQL_BASES\Backups\UTOffice-2011-04-13-03-00-00';
select @src_base_name ='UTOffice';
select @dst_base_name ='Restore1s1';
select@dst_base_path= 'e:\1CBackUp\SQL_BASES\1';
-- Calculate any depending variables
select @src_log_name = @src_base_name +'_log';
select @dst_log_name = @dst_base_name +'_log';
select @dst_base_filename = @dst_base_path +'\'+ @dst_base_name +'.mdf';
select @dst_log_filename = @dst_base_path +'\'+ @dst_log_name +'.ldf';
-- Viewing some variables for debuging
-- select @src_base_name;
-- select @dst_base_name, @dst_base_filename, @dst_log_filename;
-- Disconnect all users from destination
alter database @dst_base_name set RESTRICTED_USER with rollback immediate;
-- Restore destination from src
RESTOREDATABASE @dst_base_name FROM DISK= @arc_filename WITHFILE= 1, MOVE @src_base_name TO @dst_base_filename, MOVE @src_log_name TO @dst_log_filename, NOUNLOAD, REPLACE, STATS= 10

РАЗДЕЛ: МЕНЕДЖМЕНТ

Ведение разработки программистом 1С8

Рекомендации по хранилищу конфигурации

Рекомендуется создавать следующие логины:
· Два логина на каждого пользователя хранилища, например Осипов и Осипов2.
· Логин База под которым будет подключаться рабочая база
· Логин Администратор, под которым нельзя подключать базу к хранилищу, служит только для администрирования списка пользователей.
Можно использовать удаленное хранилище, размещенное просто по какому-то адресу в vpn. При первом подключении к хранилищу загружается вся конфигурация. Это может происходить долго в удаленном хранилище, поэтому лучше высылать разработчикам уже подключенную к хранилищу базу.

Лицензирование 1С

Нужно внимательно относиться к соблюдению лицензионной политики 1С.

Что необходимо делать при покупке 1С

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

Восстановление утерянных регистрационных карточек

Для восстановления утерянных регистрационных карточек нужно знать их номера. Без этого не восстановят. Номера можно узнать у франчайзи, которые продавали программные продукты.
Для восстановления пишется заявление во франчайзи-продавец на фирменном бланке, с печатью. Скан этого заявления отсылается во франчайзи, которое пересылает его в 1с.

Стоимость перехода с 1с81 на 1с82

Только кажется, что переход с 1с81 на 1с82 сопоставим с ценой ИТС на 3 месяца, чтобы обновиться на последний релиз. Если у вас распределенная компьютерная сеть, стоимость может влететь в копеечку.
Пример расчета в ценах марта 2012 года:
Для перехода сети из 40 магазинов на 1С8 понадобится разово купить ИТС ПРОФ на 12 месяцев и по одной подписке ИТС ДУО на каждую из розничных точек. На меньший срок и Техно с ДУО не продают. Т.е. легальный переход на 1С82 будет стоить порядка: 25 000 (ИТС ПРОФ) + 40 * 2170 (ИТС ДУ) = 111 800 (по 2 795 рублей на каждую точку). Эта подписка дает право обновляться на текущие релизы 1с в течение 12 месяцев.

= ОБНОВЛЕНИЯ =

Дата
Изменение
Место
Примечание
26.09.12
Веха
Статья подготовлена для инфостарт.
22.09.10
Правка
Реорганизована структура статей
22.01.10
Вставка
Прекращение сеансов файловой версии
17.12.09
Вставка
Мягкое перепроведение документов
05.09.08
Вставка
Хранение в базе GUID
03.08.08
Вставка
Обработка макета построителя отчета перед выводом
04.06.08
Вставка
Объекты планов обмена
21.05.08
Веха
Начато ведение заметок.

Комментариев нет:

Отправить комментарий