Личный опыт Гения 1С борьбы с платформой 1С8
Работа функции «Принадлежит элементу»
Мягкое перепроведение документов
Запуск внешних отчетов по расписанию
ФОРМЫ 1С81: ЭЛЕМЕНТЫ УПРАВЛЕНИЯ
Подсветка текущей строки табличного поля
Иерархический просмотр списков в табличном поле
Обработка макета построителя отчета перед выводом
ОТЧЕТЫ: СИСТЕМА КОМПОНОВКИ ДАННЫХ (СКД)
Программная обработка настроек СКД
Настройка группировок настройки СКД
Поиск и установка параметров настройки СКД
Отчеты, которые сложно написать на СКД
Отчеты, где ресурсы расположены выше группировок
Последовательная генерация штрих-кодов
Недопустимые символы в плане обмена
ОБМЕНЫ: РАСПРЕДЕЛЕННЫЕ ИНФОРМАЦИОННЫЕ БАЗЫ (РИБ)
Предопределенные элементы в обеих базах
ИНТЕГРАЦИЯ: РАБОТА С 1С ЧЕРЕЗ COM И OLE
Неявно описанные методы COM и OLE
Общие сведения о Com-соединениях
Выполнение произвольного кода 1С в Com-соединении
ИНТЕГРАЦИЯ: ВНЕШНИЕ КОМПОНЕНТЫ
Использование функции ПодключитьВнешнююКомпоненту
Названия таблиц и полей в физической базе 1С
Взаимодействие платформы с системой безопасности Windows
Прекращение сеансов файловой версии
Быстродействие файловой системы при работе нескольких пользователей
Советы по обновлению конфигурации
СЕРВЕР: MICROSOFT SQL SERVER ДЛЯ 1С
Планирование заданий средствами SQL-сервера
Архивирование баз средствами SQL сервера
Восстановление копии базы из архива SQL
ВЕДЕНИЕ РАЗРАБОТКИ ПРОГРАММИСТОМ 1С8
Рекомендации по хранилищу конфигурации
Что необходимо делать при покупке 1С
Восстановление утерянных регистрационных карточек
Стоимость перехода с 1с81 на 1с82
Введение
Я – программист 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С:
Процедура ОтключитьПользователя(ПользовательИБ) Экспорт
ПользовательИБ.АутентификацияОС = ложь;
ПользовательИБ.АутентификацияСтандартная = ложь;
ПользовательИБ.Записать(); //Осипов
КонецПроцедуры
Регламентные задания
Запуск внешних отчетов по расписанию
Платформа 1с81 не умеет запускать внешние отчеты и сохранять таблицы в Excel. Это умеет делать платформа 1с82.
Но чтобы получить эту возможность в 1с81, можно в COM-соединении создавать OLE-подключение к 1С81 и в нем уже выполнять нужный код.
Пример:
Функция ВыполнитьНаКлиенте(Метод) Экспорт
СтрокаСоединения = СтрокаСоединенияИнформационнойБазы();
ПарольРобота = Справочники.САПКонстанты.ПарольРобота.Значение;
СтрокаСоединения = СтрокаСоединения + "Usr=""robot"";Pwd=""" + ПарольРобота + """"; //Важно чтобы не было две подряд идущих ;;
ЗаписьЖурналаРегистрации("Отладка", , , , "Соединение для выполнения на клиенте, начало попытки: " + СтрокаСоединения);
Соединение = Новый ComОбъект("V81.Application");
Соединение.Connect(СтрокаСоединения);
ЗаписьЖурналаРегистрации("Отладка", , , , "Соединение для выполнения на клиенте, попытка прошла: " + СтрокаСоединения);
ЗаписьЖурналаРегистрации("Отладка", , , , "Выполнение метода, начало: " + Метод);
Выполнить "Соединение." + Метод;
ЗаписьЖурналаРегистрации("Отладка", , , , "Выполнение метода, завершено: " + Метод);
Соединение.ЗавершитьРаботуСистемы();
ЗаписьЖурналаРегистрации("Отладка", , , , "Завершена работа системы ");
Соединение = 0;
КонецФункции
Процедура РассылкаОтчетаПоПродавцам() Экспорт
ВыполнитьНаКлиенте("_РегламентныеЗадания.РассылкаОтчетаПоПродавцам_Код()");
КонецПроцедуры
РАЗДЕЛ: ФОРМЫ 1С81
Формы 1С81: Приёмы
Стандартная функция обработки оповещений
В 1С8 есть возможность рассылки оповещений формам.
У меня был случай, когда обработка разворачивалась из хранилища, постоянно из разного временного файла, поэтому стандартная 1С-проверка на открытость с помощью КлючУникальности не работал. Чтобы проверить, открыта форма или нет, использовал оповещения, причем завел одну стандартную глобальную процедуру на все последующие применения оповещений.
В модуле приложения добавляю процедуру:
Процедура глОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
Попытка
Источник.ОбработкаОповещения(ИмяСобытия, Параметр, Источник);
Исключение
КонецПопытки;
КонецПроцедуры
При оповещении событие транслируется в обработку оповещения формы. К сожалению, нельзя подключить локальную обработку оповещения в самой форме, поэтому использую глобальную ретрансляцию.
В самой форме для проверки открытости использую код:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Оповестить("ПроверитьОткрытаЛиМояФормаХХХ", Отказ, ЭтаФорма);
Если НЕ Отказ Тогда
Попытка //В попытке, т.к. в модуле приложения может и не быть такой функции, для универсальности
ПодключитьОбработчикОповещения("глОбработкаОповещения");
Исключение
КонецПопытки;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник) Экспорт
Если ИмяСобытия = " ПроверитьОткрытаЛиМояФормаХХХ " Тогда
Если Открыта() Тогда //Иногда форма может быть закрыта, но висеть в памяти, тогда все-же открываем новый экземпляр
Параметр = истина; //Если открыта тогда
Активизировать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Формы 1С81: Элементы управления
Табличное поле
Подсветка текущей строки табличного поля
Подсвечивать текущую строку можно в событии вывода текущей строки. Когда текущая строка меняется, событие вывода строки не вызывается. Единственный метод сменить оформление строки – вызывать событие обновление формы. Немного накладно по скорости, но работает. В примере подсвечиваются три колонки текущей строки серым цветом.
Процедура СправочникСписокПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки = Неопределено ИЛИ ЭлементыФормы.СправочникСписок.ТекущаяСтрока = ДанныеСтроки.Ссылка Тогда
ЦветФона = WebЦвета.СеребристоСерый;
ОформлениеСтроки.Ячейки.Наименование.ЦветФона = ЦветФона;
ОформлениеСтроки.Ячейки.Код.ЦветФона = ЦветФона;
ОформлениеСтроки.Ячейки.Картинка.ЦветФона = ЦветФона;
КонецЕсли;
КонецПроцедуры
Процедура СправочникСписокПриАктивизацииСтроки(Элемент)
Обновить();
КонецПроцедуры
Иерархический просмотр списков в табличном поле
Если в списке отображается дерево справочника, то управлять иерархическим просмотром нужно с использованием свойств «Дерево» и «Иерархический просмотр».
Допустим, у нас есть кнопка «Дерево» в панели «Командная панель».
Тогда код будет выглядеть следующим образом:
Процедура КоманднаяПанельДерево(Кнопка)
Если ЭлементыФормы.ТаблицаНоменклатуры.ИерархическийПросмотр Тогда
ЭлементыФормы.ТаблицаНоменклатуры.Дерево = ложь;
Иначе
ЭлементыФормы.ТаблицаНоменклатуры.Дерево = истина;
КонецЕсли;
ЭлементыФормы.ТаблицаНоменклатуры.ИерархическийПросмотр = НЕ ЭлементыФормы.ТаблицаНоменклатуры.ИерархическийПросмотр;
КонецПроцедуры
Процедура ОбновлениеОтображения()
ЭлементыФормы.КоманднаяПанель.Кнопки.Дерево.Пометка = ЭлементыФормы.ТаблицаНоменклатуры.ИерархическийПросмотр;
КонецПроцедуры
РАЗДЕЛ: УПРАВЛЯЕМЫЕ ФОРМЫ
Отладка
Часть управляемых форм выполняется на сервере. Для того, чтобы отлаживать серверный код, нужно подключать два предмета отладки - на клиенте и на сервере.
Отладка на сервере возможна только если сервер запущен с ключом -debug.
Если нет возможности изменить ключ запуска сервера, можно выгрузить базу в файловый вариант и отлаживать там, если размеры базы позволяют.
В типовых на УФ обычно отчеты выполняются через фоновые задания, чтобы отключить подобное поведение, нужно установить режим отладки, тогда отчеты будут запускаться через вызов процедуры модуля. Для этого в конфигураторе указать в Сервис - Параметры - Основные - Параметр запуска указать строку содержащую текст "РежимОтладки" (без кавычек) и запускать 1С предприятие из конфигуратора. Можно указывать этот ключ и в строке запуска.
В типовых код по проверке параметра запуска выглядит так:
ПараметрыСеанса.ПараметрыКлиентаНаСервере.Получить("ПараметрЗапуска")
Точку останова можно ставить напрямую в конце процедуры РаботаВБезопасномРежиме. ВыполнитьМетодКонфигурации на операторе Выполнить.
Интерфейсы в типовых конфигурациях
Интерфейс Команда - Обработка Панель
Используется в УТ 11.
В разделе "Открыть командный интерфейс" содержится верхнее меню с настройками видимости по ролям:
В нем содержатся общие команды с названиями вида " ДополнительныеОтчетыРегламентированныйУчет".
В модуле команды содержится однообразный код:
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ДополнительныеОтчетыИОбработкиКлиент.ОткрытьФормуКомандДополнительныхОтчетовИОбработок(
ПараметрКоманды,
ПараметрыВыполненияКоманды,
ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(),
"РегламентированныйУчет");
КонецПроцедуры
Код вызывает обработку с именем вида ПанельСправочниковРегламентированныйУчет:
В форме на управляемых элементах нарисовано меню:
Нюансы типовых конфигураций
Добавление нового объекта метаданных в типовых
После добавления нового регистра/отчета в типовых (УТ11) нужно запускать 1С с ключом ЗапуститьОбновлениеИнформационнойБазы, иначе будет ругаться, что не выполнено обновление метаданных в режиме 1С:Предприятия.
Как запустить фоновое задание без изменения конфигурации в типовых
В типовых есть функция ДополнительныеОтчетыИОбработки.ВыполнитьКоманду. Её можно использовать для обработчика фонового задания, чтобы выполнить свою обработку, помещенную в справочник внешних обработок. Можно смотреть также ДлительныеОперации.ЗапуститьВФоне.
Программная обработка управляемых форм
Добавление нового реквизита в форму
Новый добавляемый реквизит - это реквизит формы, он отличается от реквизитов объекта.
Т.е. если мы добавляем реквизит в форму справочника, его путь будет "ИмяРеквизита", в отличии от реквизита Наименование, например, путь которого "Объект.Наименование".
Реквизит добавлять в событии ПриСозданииНаСервере. В примере создается реквизит и к нему привязывается флажок.
Обратите внимание, путь к данным без приставки "Объект.":
УстановитьДействие("ПередЗаписью", "_ПередЗаписьюНаКлиенте");
НовыеРеквизиты = Новый Массив();
НовыйРеквизит = Новый РеквизитФормы("_РазрешитьРасхождениеНаименованияИПолногоНаименования", Новый ОписаниеТипов("Булево"), , "Разр.расх.имен", ложь);
НовыеРеквизиты.Добавить(НовыйРеквизит);
ИзменитьРеквизиты(НовыеРеквизиты);
ПередЭлементом = Элементы.Родитель;
Элемент = Элементы.Вставить("_РазрешитьРасхождениеНаименованияИПолногоНаименования", Тип("ПолеФормы"), ПередЭлементом.Родитель, ПередЭлементом);
Элемент.Вид = ВидПоляФормы.ПолеФлажка;
Элемент.Заголовок = "Разр.расх.имен";
Элемент.ПутьКДанным = "_РазрешитьРасхождениеНаименованияИПолногоНаименования";
Элемент.ЦветТекстаЗаголовка = WebЦвета.БледноКрасноФиолетовый;
Далее, в форме к реквизиту можно обращаться так:
&НаКлиенте
Процедура _ПередЗаписьюНаКлиенте(Отказ, ПараметрыЗаписи)
Если ЭтаФорма._РазрешитьРасхождениеНаименованияИПолногоНаименования <> истина И Объект.Наименование <> Объект.НаименованиеПолное Тогда
Отказ = истина;
Сообщить("Наименование и полное наименование расходятся, чтобы можно было записать объект, установите галочку ""Разрешить расхождение имен""");
КонецЕсли;
КонецПроцедуры
РАЗДЕЛ: Запросы
РАЗДЕЛ: ОТЧЕТЫ
Отчеты: Работа с макетами
Печать прозрачных картинок
Если на принтере прозрачная картинка печатается, как не прозрачная, то проблема обычно в драйвере принтера. Проверьте – попробуйте распечатать на любой виртуальный принтер.
Отчеты: Построитель отчета
Обработка макета построителя отчета перед выводом
К сожалению, у построителя отчета нет стандартного способа для настройки макета вывода отчета. Можно указать построителю свой макет, но обычно построитель отчета может генерировать отчеты с самыми разнообразными группировками, поэтому нельзя подготовить заранее макет на любой вариант отчета.
Выход – в динамическом изменении макета отчета. Можно получить макет построителя, обработать его, задав нужные форматы и цвет ячеек, ширину колонок и т.п., а затем указать построителю использовать новый макет для вывода отчета.
Однако не следует забывать, что новый макет будет использоваться всегда, поэтому перед выполнением отчета нужно сбросить макет.
При разработке удобно методом «Показать» перед выводом посмотреть на автоматически сформированный макет, чтобы увидеть, как называются параметры и заголовки.
Общая схема подхода такая:
ПостроительОтчетаОтчет.Макет = Неопределено; //Сбрасываем макет
ПостроительОтчетаОтчет.Выполнить(); //Формируем авто-макет
ТекМакет = ПостроительОтчетаОтчет.Макет; //Обрабатываем макет отчета
...
ПостроительОтчетаОтчет.Макет.Показать(); //Смотрим макет во время разработки
ПостроительОтчетаОтчет.Макет = ТекМакет; //Устанавливаем обработанный макет
Рассмотрим конкретные способы модификации макета.
В следующем примере показан цикл, который ищет в макете ячейки, содержащие целиком текст «Дата». Если этот текст содержится в заголовке (вид заполнения ячейки – текст), тогда меняет заголовок шапки. Если текст содержится в параметре (вид заполнения ячейки – параметр), тогда меняет ширину колонки и формат даты:
Область = Неопределено;
Пока (Истина) Цикл
Область = ТекМакет.НайтиТекст("Дата", Область, , , истина);
Если Область = Неопределено Тогда
Прервать;
КонецЕсли;
Если Область.Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр Тогда
Область.Формат = "ДФ=dd.MM.yyyy";
Область.ШиринаКолонки = 10;
КонецЕсли;
КонецЦикла;
Параметр «истина» в методе «НайтиТекст» указывает, что нужно искать текст целиком.
Бесконечный цикл – удобный инструмент для обработки всех найденных областей по указанному условию.
Отчеты: Система компоновки данных (СКД)
Программная обработка настроек СКД
В разделе описывается, как программно обрабатывать настройки СКД.
Настройка группировок настройки СКД
Для поиска группировок можно написать рекурсивный обработчик, который перебирает структуру настроек, и ищет нужную группировку. Группировки можно промаркировать именами и искать по именам.
Если точно известно, в каком месте структуры находятся нужные поля, можно использовать непосредственное указание по индексу, например:
Поле = НайтиВКоллекцииПоРеквизиту(КомпоновщикНастроек.Настройки.Структура.Получить(0).Структура.Получить(0).ПоляГруппировки.Элементы, "Поле", Новый ПолеКомпоновкиДанных("ХарактеристикаНоменклатуры"))
Поиск и установка параметров настройки СКД
В примере ищется параметр с именем «Склад» и, если найден, устанавливаетсяв значение, указанное в переменной ВыбСклад. При этом устанавливается галочка использования параметра:
ЗначениеПараметра = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Склад"));
Если ЗначениеПараметра <> Неопределено Тогда
ЗначениеПараметра.Значение = ВыбСклад;
ЗначениеПараметра.Использование = Истина;
КонецЕсли;
Поля пустого элемента в СКД
Если в отборе или группировке извлекается поле из элемента, значение которого равно пустая ссылка, например, Номенклатура.ОсновнойПоставщик, то результатом будет NULL, а не пустая ссылка.
Чтобы избежать этого, я придумал только один способ: завести пустую ссылку нужного типа, в нашем примере пустой товар с заранее известным кодом, например «ПЭ-ПУЭЛЕМЕН».
Далее в запросе писать:
ВЫБОР КОГДА Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка) Тогда &ПустаяНоменклатура ИНАЧЕ Номенклатура КОНЕЦ
А в параметрах добавить значение:
Параметры. Найти(Новый ПараметрКомпоновки(«ПустаяНоменклатура»).Значение = Справочники.Номенклатура.НайтиПоКоду(«ПЭ-ПУЭЛЕМЕН»);
В таком случае пользователь сможет делать отбор по полям элементов, которые могут содержать пустые значения.
Если не позаботиться о такой защите, то в группировке будут как минимум два значения – одно пустое, другое NULL.
А в отборе сравнение с NULL никогда не даст истину, ни в случае равенства, ни в случае неравенства.
Отчеты, которые сложно написать на СКД
На СКД можно написать практически 90% всех необходимых на практике отчетов, но некоторые отчеты довольно сложно ложатся на структуру СКД.
Отчеты, где ресурсы расположены выше группировок
Такие отчеты удобны, чтобы сравнивать значение одного ресурса (количество, сумма) по разным измерениям – по складам, периодам и т.п.
РАЗДЕЛ: ТОРГОВОЕ ОБОРУДОВАНИЕ
ТО: Настройки сканеров штрих-кода
Программирование сканеров заключается в считывании специальных служебных штрих-кодов, которые изменяют настройки сканеров. Обычно сначала считывается штрих-код входа в режим, затем – команды программирования, затем – команда подтверждения или отмены.
13-разрядные EAN коды, начинающиеся с нуля
В США и Канаде вместо EAN используется штрих-код UPC, полностью совместимый с EAN. Длина штрих-кода 13 символов. Последний – контрольный.
Однако в стандарте UPC штрих-кода, начинающиеся на ноль, читаются как 12-разрядные, первый ноль отбрасывается. Чтобы такие штрих-кода считывались нормально, нужно перепрограммировать сканер, включить опцию, которая называется примерно так: «Преоразовывать UPC в EAN».
Например, для сканера Chipher Lab 1560/1562 коды программирования выглядят так:
Восприятие CODE-128
Не все сканеры умеют читать длинные коды CODE-128-B, которыми часто записываются серийные номера и IMEI. Но даже если сканер умеет считывать подобные коды, иногда их чтение по умолчанию отключено и его требуется включить программированием сканера. Искать опцию вида «Активация штрих-кода типа CODE-128»
Например, для сканера Chipher Lab 1560/1562 коды программирования выглядят так:
Чтение длинных 19-20 разрядных штрих-кодов
Не все сканеры умеют читать очень длинные 19-20 разрядные штрих-кода. Обычно, если сканер имеет тонкий луч, то такие кода сканируются. Если луч сканера достаточно широкий, то может и не считывать.
Если штрих-код не читается сканером
Можно скачать на смартфон андроид-приложение для сканирования штрих-кодов и попробовать разобраться, какой тип штрих-кода не воспринимается сканером. Однако эти приложения тоже не воспринимают все штрих-кода, например длинные 19-20 разрядные штрих-кода не опознают.
ТО: Работа со штрих-кодами
Последовательная генерация штрих-кодов
Если нужно последовательно генерировать штрих-код с заданным префиксом, можно использовать подобный код, на вход которого подается Префикс. В примере код заносится в наименование справочника характеристики номенклатуры, соответственно и запрос ведется по наименованиям:
Если НЕ ЗначениеЗаполнено(Префикс) Тогда
Предупреждение("Не заполнен префик, обратитесь к разрабочкику!");
Возврат;
КонецЕсли;
З = Новый Запрос(
"ВЫБРАТЬ
| МАКСИМУМ(ХарактеристикиНоменклатуры.Наименование) КАК Наименование
|ИЗ
| Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
|ГДЕ
| ХарактеристикиНоменклатуры.Наименование ПОДОБНО &Маска");
З.УстановитьПараметр("Маска", бф.ДополнитьСтрокуСимволами(Префикс, 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 для организации баз данных с одинаковой конфигурацией, обменивающихся между собой информацией.
Создание начального образа
При создании начального образа выгружаются все объекты, для которых включена авторегистрация. Поэтому, если объект может мигрировать или не мигрировать в зависимости от реквизитом, нужно отключать для него авторегистрацию в плане обмена.
Как отдельно загрузить данные из файл обмена УРБД
Иногда требуется вручную загрузить данные из файла автообмена. Это требуется, если, загрузка не удается и хочется отложить ее на потом, или загрузка происходит с ошибкой и нужно загрузить хотя бы те данные, что грузятся и понять, в чем причина ошибки.
Файл обмена можно загрузить обработкой «Выгрузка-загрузка данных XML».
Для этого нужно содержимое тега V8DE:Data (используемого в РИБ) перенести внутрь тега внутрь тега V8Exch:Data (используемого в файле выгрузки-загрузки) в файле вида:
<?xml version="1.0" encoding="UTF-8"?>
<V8Exch:_1CV8DtUD xmlns:V8Exch="http://www.1c.ru/V8/1CV8DtUD/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:v8="http://v8.1c.ru/data">
<V8Exch:Data>
</V8Exch:Data>
</V8Exch:_1CV8DtUD>
Файл должен быть в кодировке UTF-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);
}
Для доступа к объектам базы можно использовать примерно следующий код:
var NewGood = Base.Справочники.Номенклатура.СоздатьЭлемент();
Выполнение произвольного кода 1С в Com-соединении
Чтобы выполнить произвольный код на языке 1С в Com-соединении, достаточно добавить в модуль внешнего соединения видимую извне (экспортируемую функцию), например, так:
Функция Run(Код) Экспорт
Перем Р;
Выполнить(Код);
Возврат Р;
КонецФункции
При этом код может устанавливать значение локальной переменной Р, значение которой и будет возвращено, как значение функции.
Интеграция: Внешние компоненты
Использование функции ПодключитьВнешнююКомпоненту
Функция «ПодключитьВнешнююКомпоненту» не работает с русскими именами каталогов. А ведь обычно файлы бросаются во временный каталог, поэтому можно использовать преобразование имени файла к схеме 8.3:
FileSystemObject=Новый COMObject("Scripting.FileSystemObject");
FileName= FileSystemObject.getFile(LongPath).ShortPath; //Файл должен уже существовать к этому моменту
Интеграция: Прочее
Веб-сервисы рассмотрены в отдельной моей статье «Веб-сервисы в 1С».
РАЗДЕЛ: АДМИНИСТРИРОВАНИЕ
Администрирование 1С
Как узнать по файлу 1CD версию платформы
10-й байт содержит номер подверсии – 1 или 2.
Ошибки SDBL
Код ошибки |
|
Примечание |
|
Лечится путем запуска в консоли SQL сервера команд:
|
Возникает при обновлении конфигурации ИБ |
Работа из командной строки
Параметры запуска из командной строки можно посмотреть в справке по 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. Узнать расположение этого каталога можно в переменных среды или через команду set temp.
Прекращение сеансов файловой версии
На одном компьютере может быть запущено несколько баз, поэтому требуется сначала определить, какой из процессов 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с.
Основное отличие PIN кодов платформ – 16 символьный код применяется для активации платформы базовой версии. 15 символьный активирует ПРО версию. Базовая версия платформы 1С Предприятие отличается про ПРОФ версии 1С Предприятие тем, что в базовой версии нельзя править конфигурацию. Поддерживаются только шаблонные конфигурации, скачанные с сайта 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
Вот еще один проверенный вариант на языке CMD:
rem Перезапуск 82 сервера
sc.exe stop "1C:Enterprise 8.2 Server Agent (x86-64)"
ping 127.0.0.1 -n 30 > nul
sc.exe start "1C:Enterprise 8.2 Server Agent (x86-64)"
rem Перезапуск 81 сервера
sc.exe stop "1C:Enterprise 8.1 Server Agent (x64)"
ping 127.0.0.1 -n 30 > nul
sc.exe start "1C:Enterprise 8.1 Server Agent (x64)"
rem Перезапуск SQL сервера / надо еще прописать перезапуск агента
rem sc.exe stop "MSSQLSERVER"
ping 127.0.0.1 -n 30 > nul
rem sc.exe start "MSSQLSERVER"
rem Финальная пауза, для демонстрации результата
ping 127.0.0.1 -n 30 > nul
Здесь между остановкой и запуском пауза в 30 секунд, чтобы служба успела остановиться.
Запуск сервера 1С
Полезно создать задание, которое раз в полчаса запускает сервер 1С. Это полезно, если сервер вылетит, а служба сервера сама не восстановится.
Сервер: 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
RESTORE DATABASE @dst_base_name FROM DISK = @arc_filename WITH FILE = 1, MOVE
@src_base_name TO @dst_base_filename, MOVE @src_log_name TO @dst_log_filename,
NOUNLOAD, REPLACE, STATS = 10
Копирование базы в SQL
Иногда требуется создать копию базы средствами SQL. Вот образец скрипта:
BACKUP DATABASE [dbt_buh] TO DISK = 'D:\BACKUP\tmp.bak' WITH INIT, NOUNLOAD, NAME = 'TMP', NOSKIP, NOFORMAT, STATS = 25
GO
RESTORE DATABASE [dbt_buh_osa] FROM DISK = 'D:\BACKUP\tmp.bak'
WITH
MOVE 'db_buh' TO 'D:\BACKUP\db_buh_osa.mdf',
MOVE 'db_buh_log' TO 'D:\BACKUP\dbt_buh_osa_log.ldf',
REPLACE
GO
Главное - указать перенос логических файлов в физические файлы в секции MOVE.
Запуск SQL Agent
Если прописывать регламентные задания (архивация, дефрагментация) через службу SQL-агент SQL-сервера, то иногда может быть проблема, что служба агента не восстанавливается и сутками висит в отключенном состоянии, не выполняя назначенные задания.
Помочь справиться с ситуацией может запись в планировщик сервера Windows запуска раз в час службы SQL-агент:
net start "SQLSERVERAGENT"
Настройки отладчика
Выбор портов для отладки
Причиной ошибки «Для выполнения отладки необходимо включить поддержку сетевого протокола TCP/IP» обычно является нехватка портов TCP/IP для отладки.
В конфигураторе пункт Отладка – Подключение показывает, какие сеансы 1С работают в режиме отладки:
Если стоит галочка «Устанавливать режим разрешения отладки при запуске», то каждая сессия будет запускаться в режиме отладки и расходовать порт из диапазона портов для отладки:
Если их много (например, работает несколько программистов), то начинаются проблемы – для отладки не хватает доступных портов.
Поэтому в каталоге выполнимого файла 1С, например C:\Program Files (x86)\1cv81\bin\conf, нужно создать файл debugcfg.xml, в нем прописать порты для отладки. Рекомендую использовать большой диапазон, чтобы всем хватило:
<config xmlns="http://v8.1c.ru/v8/debugcfg">
<debugports range="2940:3350"/>
</config>
РАЗДЕЛ: МЕНЕДЖМЕНТ
Стандарты разработки
Для форм использую разрешение 1000*600 (под монитор 1024*768). Более мелкие мониторы уже устарели, использовать форму большего размера неудобно при разработке.
Ведение разработки программистом 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 месяцев.
РАЗДЕЛ: ТЕРМИНОЛОГИЯ
Слова «До и По» для периодов
Если мы говорим до даты Д, то подразумеваем, что дата Д не включается. Если мы говорим по дату Д, то подразумеваем, что дата Д включается.
РАЗДЕЛ: ПРОЕКТИРОВАНИЕ
Проектирование: Регистры правил
Период действия записей регистров правил.
При проектировании периодических регистров правил можно использовать обычные периодические регистры сведений, но добавлять еще измерение «Дата по». В этом поле будет указываться, по какую дату включительно будет использоваться. Этот способ проще, чем перекрывать записи другими.
Например, у нас есть регистр прав доступа к документу.
С 1 января Иванов может проводить поступления по фирме Х
С 1 февраля Петров может проводить все поступления
Необходимо указать, что Иванов с 1 марта может проводить поступления по фирме У и не может проводить поступления по фирме Х.
Для этого можно сделать сторнирующую запись на 1 марта:
С 1 марта Иванов может проводить поступления по фирме Х.
Но такой способ увеличивает количество правил и приводит к ошибкам.
Проще изменить исходную запись следующим образом:
С 1 января Иванов может проводить поступления по фирме Х
= ОБНОВЛЕНИЯ =
Дата |
Изменение |
Место |
Примечание |
|
|||
|
|||
|
|||
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 |
Веха |
Начато ведение заметок. |
|