четверг, 3 апреля 2014 г.

1С. Запись/чтение "ТаблицыЗначений" в/из XML

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

Функция сохранения таблицы значений в XML:
Функция СохранитьТаблицуЗначенийВXML(Таблица, ФайлXML)
    Попытка
        Запись = Новый ЗаписьXML();
        Запись.ОткрытьФайл(ФайлXML);   
    Исключение
        Сообщить("Ошибка при создание XML файла! " + Символы.ПС + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;      
    
    Запись.ЗаписатьОбъявлениеXML();
    Запись.ЗаписатьНачалоЭлемента("root"); 
    
    МасКолонки = Новый Массив();
    Запись.ЗаписатьНачалоЭлемента("columns");  
    Для Ном = 0 по Таблица.Колонки.Количество()-1 цикл         
        Колонка = Таблица.Колонки[Ном];
        МасКолонки.Добавить(Колонка.Имя);
        
        Запись.ЗаписатьНачалоЭлемента("colum");
        Запись.ЗаписатьАтрибут("Name",Колонка.Имя);
        Запись.ЗаписатьАтрибут("Type",Строка(Колонка.ТипЗначения));
        Запись.ЗаписатьКонецЭлемента();  // colum      
    КонецЦикла;    
    Запись.ЗаписатьКонецЭлемента();  // columns
    
    Запись.ЗаписатьНачалоЭлемента("records");  
    Для Каждого СтрТаблицы из Таблица цикл
        
        Запись.ЗаписатьНачалоЭлемента("record");
        Для каждого ИмяКолонки из МасКолонки цикл
            Запись.ЗаписатьНачалоЭлемента(ИмяКолонки);
            Значение = Строка(СтрТаблицы[ИмяКолонки]);
            Запись.ЗаписатьСекциюCDATA(Значение);
            Запись.ЗаписатьКонецЭлемента();
        КонецЦикла;        
        Запись.ЗаписатьКонецЭлемента();
    КонецЦикла;    
    
    Запись.ЗаписатьКонецЭлемента();  // records    
    Запись.ЗаписатьКонецЭлемента();  // root       
    Запись.Закрыть();
    
    Возврат Истина;
КонецФункции



Функция чтения таблицы значений из XML:
Функция ЗагрузитьТаблицаЗначенийИзXML(ФайлXML)
    
    Попытка
        Чтение = Новый ЧтениеXML();
        Чтение.ОткрытьФайл(ФайлXML);   
    Исключение
        Сообщить("Ощибка при чтение данных из XML!" + Символы.ПС + ОписаниеОшибки());
    КонецПопытки;     
    
    ТЗ = Новый ТаблицаЗначений;
    Атрибут = Новый Соответствие;
    МассивКолонок = Новый Массив; 
    ТаблицаПостроена = Ложь;
    
    // Строим таблицу значений     
    Пока Чтение.Прочитать() Цикл       
        // Данные по колонке пошли
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "colum" тогда
            Атрибут.Очистить();
            Пока Чтение.ПрочитатьАтрибут() цикл
                Атрибут[Чтение.Имя] = Чтение.Значение;             
            КонецЦикла;
            ТЗ.Колонки.Добавить(Атрибут["Name"], Новый ОписаниеТипов(Атрибут["Type"]));
            МассивКолонок.Добавить(Атрибут["Name"]);
        КонецЕсли;         
        
        // Данные по колонке закончились
        Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "columns" тогда     
            ТаблицаПостроена = Истина;
        КонецЕсли;
        
        Если Не ТаблицаПостроена тогда
            Продолжить;
        КонецЕсли;         
        
        // Началась запись в таблице значений
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и Чтение.Имя = "record" тогда                     
            ЗаписьТЗ = ТЗ.Добавить();         
            Пока Чтение.Прочитать() цикл                           
                // Конец данных по записи
                Если Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента и Чтение.Имя = "record" тогда
                    Прервать;
                КонецЕсли; 
                
                // Есть такая колонка в нашей ТаблицеЗначений
                Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента и
                     МассивКолонок.Найти(Чтение.Имя) <> Неопределено тогда
                    
                    ИмяКолонки = Чтение.Имя;
                    Чтение.Прочитать();
                    Если Чтение.ТипУзла = ТипУзлаXML.Текст тогда
                        ЗаписьТЗ[ИмяКолонки]= СокрЛП(Чтение.Значение);
                    КонецЕсли;                     
                КонецЕсли;                                             
            КонецЦикла;                           
        КонецЕсли; // Данные в таблице
        
    КонецЦикла;
    Возврат ТЗ;
КонецФункции

вторник, 28 января 2014 г.

HOWTO: LINUX SAMBA PROTOCOL NEGOTIATION FAILED: NT_STATUS_INSUFFICIENT_RESOURCES – SOLVED! WINDOWS XP 2K8 WIN7 WIN8 WIN2012

Случилась тут незадача... Моя свежепоставленная kubuntu 12.04 после недельного стабильного полета вдруг перестала видеть выньдовые шары. Причем как то избирательно. К одной машине все нормально, к другой - печаль: в dolphin`e тупо не открывались шары, пропали шаровые принтера и т.п.
Обваливается с ошибкой:

$smbclient -L 192.168.10.37
PROTOCOL NEGOTIATION FAILED: NT_STATUS_INSUFFICIENT_RESOURCES

Долго безрезультатно гуглил. И... Таки нашел...
Похоже, что выньдовый LanmanServer запускается с ограничением по памяти.

Лечится так:

На выньдовом тазике запускаем regedit (Пуск -> Выполнить -> regedit) и правим такие ключи реестра:

HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\LargeSystemCache
меняем значение 0 на 1

HKLM\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\Size
меняем значение 1 на 3

Собсна, все! Теперь можно либо ребутнуть вынь, либо дернуть службы вручную:

(От имени админа запускаем cmd)
>net stop LanmanServer /y
>net start LanmanServer
>net start Browser
>net start HomeGroupListener

среда, 11 декабря 2013 г.

1С v7.7 Быстрый метод создания периферийной базы УРБД SQL

Имеем сабж)

Рухнула как то периферийная БД. Соответственно возникла необходимость создания новой. База относительно не маленькая (22 Gb). Выгрузить периферийку штатными средствами не представляется возможным (ибо ограничение на выгрузку 2 Gb в 7.7 так и не пофиксили). Через сторонние выгрузки (плагин Romix`a) - долго. Задача стояла восстановить работу предприятия в кратчайшие сроки.

Итак, приступим:

1. Через конфигуратор в центральной базе создаем новую периферийную БД.

2. Через Enterprice Manager (SQL сервер 2000), в таблице _1SBDSET центральной базы, для новой базы меняем DBSTATUS c "N" на "C", и DBFMODE c "1" на "3" (активируем ее).

3. Отключаем (Detach Database) центральную базу в Enterprice Manager, копируем файлы базы данных .MDF и .LDF туда, где будет располагаться периферийная база и подключаем ее (Attach Database), (не забываем центральную тоже назад подключить).

4. Через Query Analizer периферийной базы запускаем скрипт. Меняем номер периферийной БД 1С и имя базы SQL):

use 

declare @Nom char(3)
declare @NomCentr char(3)

select @NomCentr = dbsign from _1SDBSET where dbstatus = 'M'
set @Nom = '048'              --  МЕНЯТЬ НОМЕР на НОВОЙ НОМЕР ПЕРИФ. БАЗЫ ЗДЕСЬ!!!! (в этом случае 048)

delete from _1SDBSET
where dbsign <> @NomCentr and dbsign <> @Nom

update _1SDBSET
set dbstatus = 'P'
where dbsign = @NomCentr 

update _1SDBSET
set dbstatus = 'M'
where dbsign = @Nom

update  _1SSYSTEM
set  DBSIGN = @Nom

truncate table _1SDWNLDS
truncate table _1SUPDTS

--DBCC SHRINKDATABASE(,5)  - при желании сожмем базу (раскомментировать в этом случае)
--exec sp_changedbowner '1cuser'                       - и если база поключилась с другим владельцем, сменим на нужного



Периыерийная и центральная БД готовы к работе! Done!  © maxis33

вторник, 26 ноября 2013 г.

просмотр ip-адресов компьютеров в локальной сети

Чтобы вывести список ip-адресов компьютеров в локальной сети, можно выполнить команду:

$nmap -sP 192.168.0.1-255

возможно придется предварительно установить nmap

четверг, 19 сентября 2013 г.

Команды редактора VI

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

Действительно, такой редактор нельзя просто открыть и начать работать требуется предварительная подготовка. Зато стоит раз испытать его в работе, и поражаешься, как мог обходиться без него раньше.

Консольные системы Unix не имеют в своем базовом комплекте ни одного нормального (еще раз подчеркну это слово - НОРМАЛЬНОГО) текстового редактора.

Поэтому системный администратор должен уметь пользоваться тем, что ему дают. А дают ему несравненный "Визуальный" экранный редактор файлов - Редактор VI.


Для работы, обычно достаточно знать всего несколько команд. Обычно для работы хватает таких:

vi /file_folder/filename - открыть файл в редакторе vi
vi /file_folder/filename ++25 - открыть файл в редакторе vi и перейти к строке 25.

i - включить режим внесения изменений
[Esc] - выйти из данного режима

u - undo (отмена сделанного изменения)
CTRL + R - redo (вернуть сделанное изменение)

:w [Enter] - сохранить внесенные изменения.

:q! [Enter] - выйти без сохранения изменений
:wq [Enter] - сохранить внесенные изменения и выйти.

dd - удалет строку на которой находится курсор
x - удалет символ на котором находится курсов


[y] - копирует строку в буфер
[P] - вставляет скопированную строку после той, на которой в текущий момент находится курсор


Поиск:

/text [Enter] - выполняет поиск "text" в тексте


Автозамена:

:%s/6201/6202/gc - ищет в документе вхождение 6201 и меняет (с подтверждением) на 6202 (замена порта).


Показать/Скрыть номера строк в редакторе vi:

:set nu - нумеровать строки
:set nonu - не нумеровать строки



!!!Чтобы редактор сохранил настройки, необходимо в файле ~/.vimrc
прописать строку, например set nu





Код взят на каком-то из девелоперских серверов. Допиливаем VI под себя:

vi ~/.vimrc

Достаточно удобно по F2 сохранять результат, а по F10 выходить.

1 set nocompatible
2
3 colorscheme desert
4
5 set novisualbell
6
7 set nu
8
9 set termencoding=utf-8
10
11 set hidden
12
13 set ch=1
14 set showcmd
15
16 syntax on
17
18 set autoindent
19 set smartindent
20
21 nmap <F2> :w<cr>
22 vmap <F2> <esc>:w<cr>i
23 imap <F2> <esc>:w<cr>i<right>
24
25 imap <Ins> <Esc>i
26
27 map <F10> :q!<cr>
28 vmap <F10> <esc>:q!<cr>
29 imap <F10> <esc>:q!<cr>

четверг, 12 сентября 2013 г.

Настройка разрешения экрана для видеокарт Intel 82945G/GZ в Ubuntu


Итак, сабж... Собственно, зачем это нужно?! Должно же из коробки работать. Работало... Но, в один прекрасный момент, по каким-то загадочным причинам перестало, есть такой глючок у интеловских видух. Т.е. в настойках можно установить только разрешение 800х600, что есть грустно.
Честно скажу, логи читать было лень, ибо возвращается все назад очень нехитрыми манипуляциями.


Генерируем интересующий нас Modeline:
#cvt 1280 1024 75

выхолп:

1280x1024 74.90 Hz (CVT 1.31M4) hsync: 80.30 kHz; pclk: 138.75 MHz
Modeline "1280x1024_75.00"  138.75  1280 1368 1504 1728  1024 1027 1034 1072 -hsync +vsync


Смотрим текущие настройки экрана:
#xrandr

выхлоп:

Screen 0: minimum 320 x 200, current 800 x 600, maximum 800 x 600
VGA1 connected 800x600+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
800x600        60.3     56.2
640x480        59.9     59.9

Выставляем интересующее нас разрешение:
#export DISPLAY=:0
#xrandr --newmode "1280x1024_75.00"  138.75  1280 1368 1504 1728  1024 1027 1034 1072 -hsync +vsync
#xrandr --addmode VGA1 1280x1024_75.00
#xrandr --output VGA1 --mode 1280x1024_75.00

Примечание!!! В качестве параметров необходимо использовать "modeline", полученный в шаге 1 и VGA1, как видно из шага 2, ибо они специфичны для каждого компутера...

Создаем чистый конфиг Xorg`a, бекапим (если есть) текущий его конфиг и подкидываем новый:
#Xorg -configure
#/etc/init.d/gdm stop
#cp /etc/X11/xorg.conf /etc/X11/xorg.conf.origin
#cp ~/xorg.conf.new /etc/X11/xorg.conf

Приводим секцию "Monitor" к такому виду:
#mcedit /etc/X11/xorg.conf

Section "Monitor"
Identifier   "Monitor0"
VendorName   "Monitor Vendor"
ModelName    "Monitor Model"
Modeline     "1280x1024_75.00"  138.75  1280 1368 1504 1728  1024 1027 1034 1072 -hsync +vsync
Option       "PreferredMode" "1280x1024_75.00"
EndSection

Рестартим Xorg (или ребутим машину).

 Done.

вторник, 3 сентября 2013 г.

Организация RDP-сервера на базе Debian/Ubuntu

Итак, собсна, сабж...

Огромнейшее спасибо Kevin Cave за труды! Его скрипт очень автоматизирует установку и настройку RDP-сервера на базе Debian/Ubuntu.
Далее предлагаю вольный перевод статьи (оригинала) для тех, кто не очень дружит с буржуйским...

Качаем мега-скрипт:

$sudo apt-get install -y git
$git clone https://github.com/scarygliders/X11RDP-o-Matic.git
$cd X11RDP-o-Matic

Данный скрипт скачивает, собирает и устанавливает пакеты xrdp_0.7.0-1_<arch>.deb и x11rdp_0.7.0-1_<arch>.deb 

Запускаем инсталятор:

$sudo ./X11rdp-o-matic.sh --justdoit

!В случае ошибок сборки, докачиваем необходимые пакеты и запускаем инсталятор снова!

Параметры запуска скрипта:

--help : показать справку.

--justdoit : произвести полную компиляцию и установку всех пакетов по-умолчанию,
без вмешательства пользователя (Рекомендуется).

--nocpuoptimize : не изменять скрипт компиляции X11rdp для использования
более одного ядра процессора (если установлена, для сборки используется только одно ядро,
в противном случае - все доступные ядра процессора будут задействованы).

--nocleanup : не удалять исходники X11rdp / xrdp после установки (по-умолчанию удаляются).

--noinstall : не выполнять установку необходимых пакетов, а просто собрать их.

--nox11rdp  : собрать только xrdp, без "обертки" x11rdp (не рекомнедую, в связки очень достойно работают).

--bleeding-edge : использовать нестабильные репозитории исходных кодов.

Запускаем скрипт настройки клиентов:

$sudo ./RDPsesconfig

RDP-сервер готов!!! Для подключения, в принципе, можно использовать любой клиент с поддержкой RDPv5. Я рекомендую: Remmina (кроссплатформенный), KRDC

Стандартные виндузятные клиенты тоже подходят...