Поиск по этому блогу

вторник, 22 декабря 2015 г.

Как убедиться в том, что измененная типовая конфигурация 1С обновлена успешно?

Как убедиться, что измененную типовую конфигурацию мы обновили успешно и ничего не отвалилилось?
Итак, после обновления у нас есть 4 cf-ника:
  1. ПоставщикСтарая - старая конфигурация поставщика; 
  2. ПоставщикНовая - новая конфигурация поставщика - та, на которую обновляли; 
  3. ОсновнаяСтарая - измененная конфигурация, по сути это ПоставщикСтарая с нашими изменениями; 
  4. ОсновнаяНовая - то, что получилось после обновления ОсновнаяСтарая с помощью ПоставщикНовая. 
Теперь в двух конфигураторах сравниваем попарно:
  1. ПоставщикСтарая и ПоставщикНовая
  2. ОсновнаяСтарая и ОсновнаяНовая
Для каждого сравнения конфигураций формируем полный "Отчет о сравнении объектов..." (для всех объектов конфигурации) в формате "Подробно", с подчиненными объектами метаданных:
 

и сохраняем эти отчеты в текстовые файлы. Эти два текстовых файла сравниваем с помощью любой сравнивалки текста (я использую WinMerge).
Так вот - не считая технической информации, такой как номера строк с изменным/удаленным кодом и т.п., эти файлы НЕ ДОЛЖНЫ ОТЛИЧАТЬСЯ! Потому что оба отчёта показывают одно и то же - разницу, которую добавила в конфигурацию 1С.

После этого сравниваем попарно:
  1. ПоставщикСтарая и ОсновнаяСтарая
  2. ПоставщикНовая и ОсновнаяНовая
Аналогично сохраняем отчеты о сравнении в текстовые файлы и сравниваем эти текстовые файлы. Они тоже НЕ ДОЛЖНЫ ОТЛИЧАТЬСЯ! Потому что оба отчёта показывают одно и то же - разницу, которую добавили в конфигурацию мы.

Если что-то отличается (помимо технической информации) - значит или не накатили какое-то изменение из типовой, или затерли какое-то своё изменение.

P.S. Чтобы убрать из отчетов о сравнении неинформативный хлам (такой как номера строк с изменным/удаленным кодом и т.п.), можно выполнить в текстовых файлах с отчетами следующие замены по регекспам:
1. Заменить:
^(\s*)Объект присутствует только в(.+) конфигурации: \d+ - \d+$
на:
$1Объект присутствует только в$2 конфигурации: N - N

2. Заменить:
^(\s*)Изменено: \d+ - \d+$
на:
$1Изменено: N - N

P.P.S. Эти замены можно выполнить с помощью следующего макроса для Notepad++ (добавить в %appdata%\Notepad++\shortcuts.xml в раздел <Macros>...</Macros>)
<Macro name="&#x041E;&#x0431;&#x0440;&#x0430;&#x0431;&#x043E;&#x0442;&#x043A;&#x0430;&#x041E;&#x0442;&#x0447;&#x0435;&#x0442;&#x0430;&#x041E;&#x0421;&#x0440;&#x0430;&#x0432;&#x043D;&#x0435;&#x043D;&#x0438;&#x0438;" Ctrl="no" Alt="no" Shift="no" Key="0">
  <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
  <Action type="3" message="1601" wParam="0" lParam="0" sParam="^(\s*)&#x041E;&#x0431;&#x044A;&#x0435;&#x043A;&#x0442; &#x043F;&#x0440;&#x0438;&#x0441;&#x0443;&#x0442;&#x0441;&#x0442;&#x0432;&#x0443;&#x0435;&#x0442; &#x0442;&#x043E;&#x043B;&#x044C;&#x043A;&#x043E; &#x0432;(.+) &#x043A;&#x043E;&#x043D;&#x0444;&#x0438;&#x0433;&#x0443;&#x0440;&#x0430;&#x0446;&#x0438;&#x0438;: \d+ - \d+$" />
  <Action type="3" message="1625" wParam="0" lParam="2" sParam="" />
  <Action type="3" message="1602" wParam="0" lParam="0" sParam="$1&#x041E;&#x0431;&#x044A;&#x0435;&#x043A;&#x0442; &#x043F;&#x0440;&#x0438;&#x0441;&#x0443;&#x0442;&#x0441;&#x0442;&#x0432;&#x0443;&#x0435;&#x0442; &#x0442;&#x043E;&#x043B;&#x044C;&#x043A;&#x043E; &#x0432;$2 &#x043A;&#x043E;&#x043D;&#x0444;&#x0438;&#x0433;&#x0443;&#x0440;&#x0430;&#x0446;&#x0438;&#x0438;: N - N" />
  <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
  <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
  <Action type="3" message="1700" wParam="0" lParam="0" sParam="" />
  <Action type="3" message="1601" wParam="0" lParam="0" sParam="^(\s*)&#x0418;&#x0437;&#x043C;&#x0435;&#x043D;&#x0435;&#x043D;&#x043E;: \d+ - \d+$" />
  <Action type="3" message="1625" wParam="0" lParam="2" sParam="" />
  <Action type="3" message="1602" wParam="0" lParam="0" sParam="$1&#x0418;&#x0437;&#x043C;&#x0435;&#x043D;&#x0435;&#x043D;&#x043E;: N - N" />
  <Action type="3" message="1702" wParam="0" lParam="768" sParam="" />
  <Action type="3" message="1701" wParam="0" lParam="1609" sParam="" />
</Macro>

четверг, 29 октября 2015 г.

Вывод статуса задач BOINC в терминале Linux

Чтобы контролировать ход вычислений в BOINC можно выполнить следующую команду в терминале:
watch -n 5 "boinccmd --get_tasks | grep -e '\(fraction done:\)\|\(project URL:\)\|\(active_task_state\)\|\(estimated CPU\)\|\(current CPU time\)\|\(---\)'"
При этом на экран будет выведена (и будет обновляться каждые 5 секунд) информация, подобная этой:
1) -----------
   project URL: http://sat.isa.ru/pdsat/
   final CPU time: 0.000000
   active_task_state: EXECUTING
   checkpoint CPU time: 29928.380000
   current CPU time: 30554.660000
   fraction done: 0.833333
   estimated CPU time remaining: 3773.624642
2) -----------
   project URL: http://sat.isa.ru/pdsat/
   final CPU time: 0.000000
   active_task_state: EXECUTING
   checkpoint CPU time: 14886.500000
   current CPU time: 15626.640000
   fraction done: 0.433333
   estimated CPU time remaining: 12963.986928
3) -----------
   project URL: http://www.worldcommunitygrid.org/
   final CPU time: 0.000000
   active_task_state: UNINITIALIZED
   checkpoint CPU time: 0.000000
   current CPU time: 0.000000
   fraction done: 0.000000
   estimated CPU time remaining: 81226.112086
Если BOINC запускается на отдельном сервере (или в отдельной виртуалке), то для автоматического запуска предыдущей команды можно добавить в .bashrc следующий код:
if [ $(tty) == "/dev/tty1" ]; then
  watch -n 5 "boinccmd --get_tasks | grep -e '\(fraction done:\)\|\(project URL:\)\|\(active_task_state\)\|\(estimated CPU\)\|\(current CPU time\)\|\(---\)'"
fi
Сайт проекта BOINC: https://boinc.berkeley.edu/

Данный текст доступен по лицензии Creative Commons Attribution (CC BY)

среда, 26 августа 2015 г.

Загрузка Tails с помощью Grub2 из iso-файла на жестком диске

Проверялось на Tails 1.5 x86_64.
Дописываем в /etc/grub.d/40_custom:
menuentry "Tails 1.5 x86_64 ISO" --class tails --class gnu-linux --class gnu --class os {
 set isofile=var/download/tails-i386-1.5/tails-i386-1.5.iso
 loopback loop (hd0,2)/$isofile
 linux (loop)/live/vmlinuz2 boot=live config findiso=$isofile apparmor=1 security=apparmor nopersistent noprompt timezone=Etc/UTC block.events_dfl_poll_msecs=1000 splash noautologin module=Tails  noapic noapm nodma nomce nolapic nomodeset nosmp vga=normal
 initrd (loop)/live/initrd2.img
}
при этом заменяем "(hd0,2)" на номер диска и раздела, на котором лежит iso-образ Tails, а "var/download/tails-i386-1.5/tails-i386-1.5.iso" заменяем на путь к файлу образа относительно корня этого раздела (обратите внимание, что слэш "/" в начале пути НЕ УКАЗЫВАЕМ!). После этого выполняем
в Ubuntu:
$ sudo update-grub2
в Fedora:
$ sudo grub2-mkconfig -o /boot/grub2/grub.cfg
и перезагружаемся. В меню Grub2 должен появиться новый пункт "Tails 1.5 x86_64 ISO" для загрузки Tails.
Примечания:
  • Параметры загрузки взяты из <tails-i386-1.5.iso>/isolinux/live.cfg (раздел "label live-amd64"). Там же можно посмотреть параметры для загрузки в 32-хразрядном режиме (раздел "label live").
  • Вместо опции findiso=$isofile можно указать опцию fromiso=/dev/disk/by-uuid/3cb868a1-260e-45d0-a1c9-b42d09ff2aa3/$isofile (или fromiso=/dev/sda2/$isofile), заменив UUID (или название) раздела диска на свой.
P.S. Немного не в тему, но где-то надо было написать... Для запуска из iso-файла DoudouLinux 2.1 Hyperborea можно попробовать такой вариант (у меня работает только в виртуалке, а на десктопе зависает в процессе загрузки; впрочем, он зависает на этом же месте и при загрузке с usb-флешки, так что проблема скорее всего не параметрах загрузки, а в чём-то другом; разбираться пока времени нет):
menuentry "DoudouLinux 2.1 ISO" --class doudoulinux --class gnu-linux --class gnu --class os {
 set isofile=var/download/doudoulinux-hyperborea-2.1-ru.iso
 loopback loop (hd0,2)/$isofile
 linux (loop)/live/vmlinuz findiso=$isofile boot=live config locales=ru_RU.UTF-8 keyboard-layouts=ru,us keyboard-variant=oss,, keyboard-options=grp:alt_shift_toggle,lv3:ralt_switch,compose:menu,terminate:ctrl_alt_bksp utc=no timezone=Europe/Moscow nox11autologin nomodeset video=uvesafb:mode_option=640x480-16,mtrr=3,scroll=ywrap username=tux hostname=doudoulinux
 initrd (loop)/live/initrd.img
}
Сайт Tails: https://tails.boum.org/
Сайт DoudouLinux: http://www.doudoulinux.org/

Данный текст доступен по лицензии Creative Commons Attribution (CC BY)

вторник, 18 августа 2015 г.

Выгрузка из 1С:Бухгалтерия декларации по НДС, содержащей ошибки

Проверялось на: 1С:Бухгалтерия 2.0.64.31.
1С:Бухгалтерия не даёт выгрузить декларацию по НДС, в которой есть ошибки. Чтобы обойти это справедливое, но не всегда нужное ограничение, можно воспользоваться описанным ниже способом.
  1. Читаем http://kb.mista.ru/article.php?id=105, создаем обработку Отладка.epf, в модуле которой пишем код: 
    Функция Присвоить(А, Б) Экспорт
      А = Б;
      Возврат А;
    КонецФункции
  2. Запускаем Конфигуратор, находим в дереве конфигурации отчет РегламентированныйОтчетНДС, открываем форму ФормаОтчета2015Кв1, переходим в текст модуля формы и ставим точку остановка в функции Функция ВыгрузкаВозможна(Параметры)  на последнем операторе "Возврат СтатусПроверки;".
  3. Запускаем 1С:Предприятие в режиме отладки, заходим в Регламентированную отчетность, запускаем выгрузку декларации по НДС. Срабатывает точка останова.
  4. Переходим в Конфигуратор, нажимаем Shift+F9 ("Вычислить выражение..."), в поле "Выражение" пишем (всё одна строка):
    ВнешниеОбработки.Создать("C:\Путь\Куда\Сохранили\Обработку\Отладка.epf").Присвоить(СтатусПроверки, Истина)
    и нажимаем кнопку "Рассчитать". После этого закрываем окно "Вычислить выражение..." и по кнопке F5 ("Продолжить отладку") продолжаем выполнение кода.
  5. Профит!
Лучше один раз увидеть, чем сто раз услышать (скриншот):


P.S. Если есть возможность вносить изменения в конфигурацию, то можно просто временно поменять "Возврат СтатусПроверки;" на "Возврат Истина;".

Данный текст доступен по лицензии Creative Commons Attribution (CC BY)

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

Создание многострочного электронного письма из командной строки Thunderbird

Чтобы создать многострочное (с символами перевода строки) электронное письмо в Thunderbird из командной строки можно воспользоваться следующими способами

В Linux создаём файл body.txt c текстом письма и выполняем команду (это всё одна строка):
thunderbird -compose "to='larina@example.com',subject='Привет',body='$(cat body.txt)'"
В Windows (это всё одна строка):
"C:\Program Files\Mozilla Thunderbird\thunderbird.exe" -compose "format=1,to='onegin@example.com',subject='Привет',body='<p>Я к вам пишу - чего же боле?<br>Что я могу еще сказать?<br>Теперь, я знаю, в вашей воле...<br></p><p>Т.Л.</p>'"
Сайт Thunderbird: https://www.mozilla.org/en-US/thunderbird/

Данный текст доступен по лицензии Creative Commons Attribution (CC BY)

вторник, 4 августа 2015 г.

Настройка меню пользователя в Far Manager

В Far Manager есть так называемое "Меню пользователя" (перекочевавшее ещё из Norton Commander), которое вызывается по F2, и которое "предназначено для упрощения выполнения часто используемых операций" (цитата из встроенной справки).
В данный момент я использую это меню для двух основных типов операций:
  1. Быстрая навигация по файловой системе.
  2. Выполнение команд над выделенными файлами.
Для ускорения навигации по файловой системе я предлагаю добавить в пользовательское меню пункты, у которых в качестве команды указано"cd <путь-к-нужной-папке>".
Например, если создать пункт меню, у которого "Hot key" = "W", "Label" = "Go to Work", а "Commands" = "cd D:\Work", то при последовательном нажатии клавиш F2 и W, мы моментально попадаем в папку "D:\Work".
Аналогично если задать "Hot key" = "D", "Label" = "Go to My Documents", а "Commands" = "cd %userprofile%\Documents", то при последовательном нажатии клавиш F2 и D, мы переходим в папку "Мои документы".
Всё просто. Главное значение имеет удачный выбор горячих клавиш. Очень важно чтобы в голове была чёткая ассоциация между буквой (или цифрой), которая назначена в качестве горячей клавиши, и папкой, в которую нужно перейти. Это позволит не тратить лишнее время на размышления и для перехода в нужную папку потребуется нажатие всего двух-трёх клавиш.
Почему может понадобиться нажатие трёх клавиш? Иногда возникает такая ситуация: есть две папки, допустим "D:\Folder1" и "D:\Folder2". Их названия настолько созвучны, что так и хочется и той, и другой в качестве горячей клавиши назначить "F". Но двум командам назначить одну и ту же горячую клавишу нельзя (если честно, то можно, но срабатывать будет только одна из них). Данную задачу можно решить так: создаём подменю (нажимаем F2, затем Ins, выбираем пункт [Insert menu]), у которого "Hot key" = "F" и Label = "Go to Folder<N>", затем заходим в этом подменю и создаём в нём две команды - первая с "Hot key" = "1", "Label" = "Go to Folder1", "Commands" = "cd D:\Folder1", а вторая с "Hot key" = "2", "Label" = "Go to Folder2", "Commands" = "cd D:\Folder2". Теперь, нажимая последовательно F2, F, 1 мы переходим в папку "D:\Folder1", а нажимая F2, F, 2 - в папку "D:\Folder2".

Теперь о выполнении команд над выделенными файлами.
В качестве первого примера рассмотрим команду быстрого создания резервной копии файла (или нескольких файлов). Разумеется, можно воспользоваться встроенными в Far Manager возможностями по работе с архивами, т.е. нажать Shift+F1 и просто добавить выделенный файл в архив. Но мне хочется, чтобы имя файла архива автоматически строилось по шаблону "<дата-создания-архива><имя-архивируемого-файла><время-создания-архива>.7z". Для этого я  добавил пункт меню с "Hot key" = "+", "Label" = "Arc file !&", "Commands" = "D:\.scripts\arcfile.bat !&". Как видно, при выборе данного пункта меню вызывается bat-файл, которому в качестве параметров передаются имена выделенных файлов (они будут любезно подставлены Far Manager-ом вместо метасимволов "!&"). Содержимое файла arcfile.bat такое:
for /F "tokens=1,2,3 delims=." %%i in ("%DATE%") do set DATEARC=%%k-%%j-%%i
for /F "tokens=1,2 delims=," %%i in ("%TIME%") do set TIMEHHMMSS=%%i
for /F "tokens=1,2,3 delims=:" %%i in ("%TIMEHHMMSS%") do set TIMEARC=%%i%%j%%k
set TIMEARC=%TIMEARC: =0%

set ARCFILE="%DATEARC%-%~1.%TIMEARC%.7z"

"C:\Program Files (x86)\7-Zip\7z.exe" a %ARCFILE% %*
if ERRORLEVEL 1 pause
Большая часть этого bat-файла предназначена для генерацией имени результирующего архива, после чего вызывается архиватор 7z, который и делает всю работу. По окончанию работы 7z мы проверяем ERRORLEVEL (код ошибки), и если "что-то пошло не так", то останавливаемся по команде "pause".
Теперь если мы установим курсор на файл test.txt и последовательно нажмём F2 и +, то на выходе мы получим архив 2015-08-04-test.txt.202946.7z, в котором будет сохранена резервная копия файла test.txt.

В качестве второго примера рассмотрим команду вычисления md5-сумм выделенных файлов с сохранением результата в указанный файл. Добавляем пункт меню с "Hot key" = "5", "Label" = "md5sum !&", "Commands" = "md5sum !& > !?$Md5sumHistory$Enter md5-file name?(!.!).md5!". Команда выглядит достаточно громоздко, и на первый взгляд может вообще показаться, что это какой-то хаотический набор символов, но не всё так страшно. Разберём по порядку, слева направо: "md5sum !&" вычисляет md5-суммы выделенных в панели Far Manager файлов, затем с помощью символа ">" вывод этой команды перенаправляется в файл, имя которого задаётся конструкцией "!?$Md5sumHistory$Enter md5-file name?(!.!).md5!". Эта конструкция предназначена для вывода диалогового окна, в котором пользователь может указать имя файла, в котором он хочет сохранить md5-суммы. Формат этой конструкции такой "!?$<history>$<title>?<init>!". В <history> указывается произвольный уникальный символьный идентификатор, с которым будет связана история прошлых пользовательских вводов (в нашем случае это "Md5sumHistory"). В <title> указывается подсказка пользователю что от него требуется ("Enter md5-file name"). А в <init> указывается значение по умолчанию (в нашем случае, это "(!.!).md5", т.е. имя первого выделенного файла, к которому дополнительно добавлено расширение .md5). После того, как пользователь введет имя файла (или просто согласится с именем файла по умолчанию) Far Manager выполнит команду "md5sum !& > имя-файла-которое-указал-пользователь".
Т.о, если теперь установить курсор на файл test.txt и последовательно нажать F2, 5 и Enter, то на выходе мы получим файл test.txt.md5, в котором будет сохранена md5-сумма файла text.txt.

Более подробно узнать о возможностях "Меню  пользователя" в Far Manager, а также о существующих метасимволах, можно из встроенной справки, которую можно вызвать последовательно нажав F2 и F1.

Сайт Far Manager: http://farmanager.com/
Данный текст доступен по лицензии Creative Commons Attribution (CC BY)

суббота, 18 июля 2015 г.

Обмен файлами между компьютером с ОС Linux и мобильным устройством на Android

У меня периодически возникает необходимость перекинуть файлы (музыку/видео/книжки) с компа, на котором стоит Linux (сейчас это Fedora 22, а до этого была Xubuntu 12.04), на электронную книжку PocketBook IQ701 с ОС Android.
Разумеется, можно просто подключить устройство к компьютеру usb-шнурком или достать из него флэш-карту и воткнуть её в кардридер, но во-первых, это дополнительные движняки, а во-вторых, мы не ищем легких путей. ))
Первое время кидал файлы через Dropbox. Но идея использовать неподконтрольный внешний облачный сервис для хранения моих личных файлов, пусть даже и временного, мне не нравилась никогда (как говорится "если у Вас нет паранойи, это ещё не значит, что за Вами не следят").
Начал искать способ как сделать так, чтобы данные не покидали  локальной сети. Ну и конечно хотелось обойтись "малой кровью", т.е. без установки "настоящего" samba- или ftp-сервера.
В итоге остановился на таком решении.
На linux-систему устанавливаем пакет pyftpdlib (есть в репах большинства дистрибутивов), в терминале выполняем:
$ cd /путь/к/директории/с/файлами
$ python -m pyftpdlib
При этом на порту 2121 стартует ftp-сервер, к которому мы можем подключиться с android-устройства (например, c помощью Ghost Commander или другого файлового менеджера, который умеет ftp) и забрать нужные файлы. Если требуется скинуть файлы с android на linux-хост, то сервер запускаем с ключом -w:
$ python -m pyftpdlib -w
По окончании передачи просто "срубаем" ftp-сервер по Ctrl+C и всё.

Сайт проекта pyftpdlib: https://github.com/giampaolo/pyftpdlib
Примеры использования pyftpdlib: https://pythonhosted.org/pyftpdlib/tutorial.html (см. раздел "Command line usage")

Если нужно только передать файлы из linux-системы на android и не хочется вообще ничего устанавливать дополнительно, то можно воспользоваться SimpleHTTPServer.
Для этого на linux-системе запускаем терминал и выполняем:
$ cd /путь/к/директории/с/файлами
$ python -m SimpleHTTPServer 8000
На android-устройстве браузером заходим на адрес http://<ip-адрес-linux-хоста>:8000 (например, http://192.168.7.77:8000) и качаем наши файлы.
Документация по SimpleHTTPServer: https://docs.python.org/2/library/simplehttpserver.html

P.S. Входящие подключения на linux-системе могут блокироваться файрволом, поэтому для реализации описанных схем может дополнительно понадобиться его настройка.

Данный текст доступен по лицензии Creative Commons Attribution (CC BY)